Shiro的三种授权(十二)

前提就是在Realm的授权方法中查询出权限并返回List<String>形式

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        // 从 principals获取主身份信息
        // 将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
        ActiveUser activeUser = (ActiveUser) principals.getPrimaryPrincipal();

        // 根据身份信息获取权限信息
        // 从数据库获取到权限数据
        List<SysPermission> permissionList = null;
        try {
            permissionList = sysService.findPermissionListByUserId(activeUser.getUserid());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 单独定一个集合对象
        List<String> permissions = new ArrayList<String>();
        if (permissionList != null) {
            for (SysPermission sysPermission : permissionList) {
                // 将数据库中的权限标签 符放入集合
                permissions.add(sysPermission.getPercode());
            }
        }

        // 查到权限数据,返回授权信息(要包括 上边的permissions)
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        // 将上边查询到授权信息填充到simpleAuthorizationInfo对象中
        simpleAuthorizationInfo.addStringPermissions(permissions);

        return simpleAuthorizationInfo;
    }

1.applicationContext-shiro.xml配置

解释:访问上面这个需要有item:edit权限。

2.注解方法:

开启controller类aop支持

在springmvc.xml中配置:

<!-- 开启aop,对类代理 -->
    <aop:config proxy-target-class="true"></aop:config>
    <!-- 开启shiro注解支持 -->
    <bean
        class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>

在controller方法中添加注解

3.JSP授权

Jsp页面添加:

<%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %>


标签名称


标签条件(均是显示标签内容)


<shiro:authenticated>


登录之后


<shiro:notAuthenticated>


不在登录状态时


<shiro:guest>


用户在没有RememberMe时


<shiro:user>


用户在RememberMe时


<shiro:hasAnyRoles name="abc,123" >


在有abc或者123角色时


<shiro:hasRole name="abc">


拥有角色abc


<shiro:lacksRole name="abc">


没有角色abc


<shiro:hasPermission name="abc">


拥有权限资源abc


<shiro:lacksPermission name="abc">


没有abc权限资源


<shiro:principal>


显示用户身份名称

                        <shiro:principal property="username"/>     显示用户身份中的属性值

总结:

当调用controller的一个方法,由于该 方法加了@RequiresPermissions("item:query") ,shiro调用realm获取数据库中的权限信息,看"item:query"是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

当展示一个jsp页面时,页面中如果遇到<shiro:hasPermission name="item:update">,shiro调用realm获取数据库中的权限信息,看item:update是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。

时间: 2024-11-03 01:32:27

Shiro的三种授权(十二)的相关文章

Linux运维 第三阶段 (十二)tcp wrapper

Linux运维第三阶段(十二)tcp wrapper tcp wrapper tcp wrapper(工作在TCP层的访问控制工具,通常只对TCP协议的应用做控制,它本身只是个库文件libwrap.so(由glibc提供)) 当来自客户端的请求访问本机服务时,请求先到达本机网卡,再到内核TCP/IP协议栈,路由发现是访问本机的,转至用户空间服务所监听的套接字上,服务响应送至内核TCP/IP协议栈,再通过路由经网卡返回至客户端:有了tcp wrapper后,在这过程当中附加了一层访问控制机制,由t

ubuntu/linux mint 创建proc文件的三种方法(二)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

【背包问题】0-1背包、完全背包、多重背包、混合三种背包、二位费用背包、分组背包

一.0-1背包问题 输入:第一行物品的个数n,第二行背包的质量m,随后n行每行给出每个物品的重量和价值,每种物品只有一个. 输出:背包可以达到的最大价值 样例输入: 5 10 1 5 2 4 3 3 4 2 5 1 样例输出: 14 动态规划的过程中需要逆序,因为如果不是逆序那么 当i=0的时候 f[0]=0; f[1]=max(f[1],f[1-w[0]]+v[0])=5; f[2]=max(f[2],f[2-w[0]]+v[0])=10; f[3]=max(f[3],f[3-w[0]]+v[

WebApi 的三种寄宿方式 (二)

程序集和宿主不在一个程序集 新建一个类库: SelfHost: 方法一: 1.添加对MyControllers类库的引用. 2.在控制台代码中加入一行代码: 当然,可以添加多个程序集.(记得引用) var config = new HttpSelfHostConfiguration("http://localhost:9527"); config.Routes.MapHttpRoute( "API Default", "api/{controller}/{

shiro框架 4种授权方式 说明

1. shiro的配置文件(applicationContext-shiro.xml)中使用filterChain过滤url的方式 详细配置看注释 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc

大三上学期十二周总结

本周对python课程的基础知识进行了适当的复习,掌握了python的format格式化方法.循环结构.判断结构.以及列表文件的读取和写入,对上课内容有了初步的理解.然后开始复习关系操作系统的相关概念,对操作系统的进程.线程概念进行了区分,了解了文件系统的概念和中断控制器的实现过程. 对预科班进行了第三次的考核,整体水平达到了小组中等水平,学习进度基本与小组正式成员持平,进行下一阶段学习问题不大. 对下周做如下学习计划: 1.对socket套接字编程进行复习,加深理解. 2.对Java8新特性拉

汇编语言(王爽 第三版)实验十二

assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do0 mov ax,0 mov es,ax mov di,200h mov cx,offset do0end-offset do0 cld rep movsb mov ax,0 mov es,ax mov word ptr es:[0*4],200h mov word ptr es:[0*4+2],0 mov ax,4c00h int 21h do0: jm

控制input输入的三种方法(二jquery实现2)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">  <html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>About</title><script src="http://code.jquer

字典转模型的三种方法之二:KVC

1 -(NSArray *)tgs 2 { 3 NSString *path = [[NSBundle mainBundle]pathForResource:@"tgs" ofType:@"plist"]; 4 NSMutableArray *tgsArray = [NSMutableArray array]; 5 NSArray *tgsDicts = [NSArray arrayWithContentsOfFile:path]; 6 for (NSDiction