Shiro note
2017-10-19 21:10
106 查看
我们需要实现Realms的Authentication和Authorization。其中Authentication是用来验证用户身份,Authorization是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等ApacheShiro核心通过Filter来实现,就好像SpringMvc通过DispachServlet来主控制一样。既然是使用Filter一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。通常情况下,在Realm中会直接从我们的数据源中获取Shiro需要的验证信息。可以说,Realm是专用于安全框架的DAO.Shiro的认证过程最终会交由Realm执行,这时会调用Realm的getAuthenticationInfo(token)方法。该方法主要执行以下操作:1、检查提交的进行认证的令牌信息2、根据令牌信息从数据源(通常为数据库)中获取用户信息3、对用户信息进行匹配验证。4、验证通过将返回一个封装了用户信息的AuthenticationInfo实例。5、验证失败则抛出AuthenticationException异常信息。而在我们的应用程序中要做的就是自定义一个Realm类,继承AuthorizingRealm抽象类,重载doGetAuthenticationInfo(),重写获取用户信息的方法。shiro的权限授权是通过继承AuthorizingRealm抽象类,重载doGetAuthorizationInfo();当访问到页面的时候,链接配置了相应的权限或者shiro标签才会执行此方法否则不会执行,所以如果只是简单的身份认证没有权限的控制的话,那么这个方法可以不进行实现,直接返回null即可。
作者:z77z 链接:http://www.jianshu.com/p/672abf94a857 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接权限的实现
在这个方法中主要是使用类:SimpleAuthorizationInfo就是说如果在shiro配置文件中添加了filterChainDefinitionMap.put("/add","perms[权限添加]");就说明访问/add这个链接必须要有“权限添加”这个权限才可以访问,如果在shiro配置文件中添加了filterChainDefinitionMap.put("/add","roles[100002],perms[权限添加]");就说明访问/add这个链接必须要有“权限添加”这个权限和具有“100002”这个角色才可以访问。
//实际开发,当前登录用户的角色和权限信息是从数据库来获取的
//实际开发,当前登录用户的角色和权限信息是从数据库来获取的
//实际开发,当前登录用户的角色和权限信息是从数据库来获取的将
这个账号的角色信息和权限信息从数据库查出来,放在
SimpleAuthorizationInfo中,作为
doGetAuthorizationInfo()的返回值
info.setStringPermissions(permissionSet);
List<SysRole>roleList=sysRoleService.selectByMap(map);Set<String>roleSet=newHashSet<String>();for(SysRolerole:roleList){roleSet.add(role.getType());}*///实际开发,当前登录用户的角色和权限信息是从数据库来获取的,我这里写死是为了方便测试Set<String>roleSet=newHashSet<String>();roleSet.add("100002");info.setRoles(roleSet);
/***授权*/@OverrideprotectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){System.out.println("权限认证方法:MyShiroRealm.doGetAuthenticationInfo()");SysUsertoken=(SysUser)SecurityUtils.getSubject().getPrincipal();StringuserId=token.getId();SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo();//根据用户ID查询角色(role),放入到Authorization里。/*Map<String,Object>map=newHashMap<String,Object>();map.put("user_id",userId);List<SysRole>roleList=sysRoleService.selectByMap(map);Set<String>roleSet=newHashSet<String>();for(SysRolerole:roleList){roleSet.add(role.getType());}*///实际开发,当前登录用户的角色和权限信息是从数据库来获取的,我这里写死是为了方便测试Set<String>roleSet=newHashSet<String>();roleSet.add("100002");info.setRoles(roleSet);//根据用户ID查询权限(permission),放入到Authorization里。/*List<SysPermission>permissionList=sysPermissionService.selectByMap(map);Set<String>permissionSet=newHashSet<String>();for(SysPermissionPermission:permissionList){permissionSet.add(Permission.getName());}*/Set<String>permissionSet=newHashSet<String>();permissionSet.add("权限添加");info.setStringPermissions(permissionSet);returninfo;}
相关文章推荐
- ifstream note
- Python 核心编程笔记_Chapter_6_Note_1 序列_字符串_列表_元组
- Studying note of GCC-3.4.6 source (79)
- Business Analysis note part 1
- Studying note of GCC-3.4.6 source (90)
- Spring Cache 和 Apache Shiro整合的超级深坑
- [HandyNote] 0.6.0 Changes
- 【投稿】Machine Learning With Spark Note 2:构建简单的推荐系统
- The NOTE of learning ASP.NET [3] [关于ASP.NET配置文件 web.config]
- 林轩田(learning from data note)
- The NOTE of learning ASP.NET [18] 关于.NET(GC)内存回收机制
- Apache Shiro 整合Spring 进行权限验证 以及在Freemarker中使用shiro标签
- Studying note of GCC-3.4.6 source (112)
- Shiro权限说明
- Spring v3.0.2 Learning Note 5 - Lifecycle of Beans
- shiro-登陆增加一个字段
- New Concept English 2--note 1
- 16.Note the following functionalities of various background processes:
- note in using [Interface]
- Shiro 分析