权限控制,Apache Shiro 主流两种方式: 粗粒度的基于URL级别的权限控制. 细粒度的基于方法级别权限控制 数据表: 用户 m:n 角色 m:n 权限 m:n 菜单(用来实现不同登录用户展示的菜单不同) 用户表为什么不和权限表直接关联,而是出现了一个角色表? 如果权限很多,每次给对应的用户进行权限分配是一个很浪费效率的工作,可以将权限提前绑定到角色表中, 每次分配权限的时候只需要将对应的角色分配给用户,大大的提高权限分配的工作效率。 粗粒度基于url的权限控制 基于Filter完成 细粒度基于方法的权限控制 基于动态代理和自定义注解完成 apache shiro 的应用安全四要素,一个保护应用的API: Authentication 认证 Authorization 授权 Cryptography 数据加密 Session Management 会话管理 shiro权限控制的方式 1. 基于代码编写实现(硬编码) 不讲 2. URL实现权限控制 3. 基于方法权限控制 4. 页面自定义标签权限控制 执行流程 Application code ---> Subject ---> seucurityManage---> Realm shiro 完成基于URL的权限控制步骤: 1. 在web.xml中配置代理过滤器DelegationgFilterProxy,class-name为shiroFilter 2. 在applicationContext.xml配置bean,id为shiroFilter,这个才是真正的过滤器,class为ShiroFilterFactoryBean 3. 上面的bean中需要注入安全管理器securityManagement,未认证的跳转页面,登录成功跳转的页面,认证后,权限不足跳转页面 shiro URL控制过滤器规则filterChainDefinitions: anon未登录可以访问 authc登陆后才能访问 perms指定访问某一资源需要的权限 roles指定访问某一资源需要的角色 4. 创建一个安全管理器 : securityManagement的bean,class="DefaultWebSecurityManager" 需要注入一个realm,在代码中创建并注册一个realm类。 5. 创建生命周期,用来初始化一些参数 登录认证的步骤: 1. 前台发送登录数据和请求 2. 创建action接收,创建subject对象: Subject subject = securityUtils.getSubject(); subject.login(new UsernamePasswordToken(modle.getUsername,model.getPassword)); 3. 创建Realm类继承AuthorizingRealm,实现其认证和授权两个方法,并加入注解@Server 并交由spring管理 认证方法 AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){ UsernamePasswordToken tok = (UsernamePasswordToken)token; // 根据用户用去数据库查询用户对象 User user = UserService.findByUsername(tok.getUsername()); if(user == null){ // 如果返回的用户为null,表示没有查询到用户,直接返回null即可 return null; }else { // 如果查询到用户,返回对应的对象,将查询到的用户的password交给securityManager进行认证 return new SimpleAuthenticationInfo(user, user.getPassword, getName()); } } 授权方法 AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc){ // 创建一个返回的对象 SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //1. 得到当前的用户 Subject subject = SecurityUtils.getSubject(); User user = (User)subject.getPrincipal(); //2. 根据当前用户查询对应的角色和权限 from Role r inner join fetch r.users u where u.id = ?返回List<Role> from Permission p inner join fetch p.roles r inner join fetch r.users u where u.id = ? 返回List<Permission> //3. 将对应的角色和权限交给shiro for(Role role:roles){ authorizationInfo.addRole(role) } for(Permission permission:Permissions){ authorizationInfo.addStringPermission(permission) } //4. 返回指定的对象 return authorizationInfo; } shiro 完成基于方法的权限控制步骤: 1. 在方法上添加注解: @RequiresPermissions(权限) @RequiresRoles(角色) 2. 在applicationContext.xml中配置spring aop对spring管理bean对象开启shiro注解支持 3. 需要设置使用CGLIB代理, shiro 实现页面元素的显示控制: 引入标签库 <%@taglib uri="" profix="" %> 代码侵入式的权限判断 使用java代码做if-else的判断是否具有权限。 权限设置风格 : 例如: courier courier:add courier:delete courier:update courier:list courier 是其他四个权限的父权限,所有设置为courier权限之后,就会具有其他四个权限。 了解shiro权限控制的流程,不用shiro提供的注解,使用自定义注解完成
权限控制,Apache Shiro
最新推荐文章于 2025-07-10 20:34:18 发布