您的位置:首页 > 其它

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(),重写获取用户信息的方法。
作者:z77z
链接:http://www.jianshu.com/p/672abf94a857
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

链接权限的实现

shiro的权限授权是通过继承AuthorizingRealm抽象类,重载doGetAuthorizationInfo();当访问到页面的时候,链接配置了相应的权限或者shiro标签才会执行此方法否则不会执行,所以如果只是简单的身份认证没有权限的控制的话,那么这个方法可以不进行实现,直接返回null即可。
在这个方法中主要是使用类: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;}
这个类的实现是完成了我们学习目标的第二个任务。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航