(三)shiro权限认证(授权)
2016-12-22 16:12
295 查看
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在 Shiro中,代表访问系统的用户,即
Subject;
编程式授权
1.1 基于角色的访问控制
封装一个shiro的util用于访问配置文件,userName和password
配置一个新的ini文件jdbc_role.ini
基于角色的控制访问有三个方法:hasRole()、hasRoles()和hasAllRoles()
hasRole():如果subject有这个角色,返回true
hasRoles():接收一个list集合,依次判断是否有这些角色,并返回hasRole的数组
hasAllRoles():传入list集合,判读subject含有这些所有的角色,如果都有返回true,不是都有返回false
用户验证成功
有role2权限
用户验证成功
都有
用户验证成功
有role1权限
有role2权限
jack输出结果:
用户验证成功
没有role2权限
用户验证成功
不是都有
用户验证成功
有role1权限
没有role2权限
1.2 基于权限的访问控制
配置文件jdbc_permission.ini
基于权限的访问控制有两个方法:isPermitted()和isPermittedAll()
其中isPermitted()方法可以接收的参数类型:
isPermitted(String)或isPermitted(Permission):如果含有这个权限则返回true
isPermitted(List)或isPermitted(String[]):依次判断这个集合或者数组是否含有这些权限,并把这些结果存入一个boolean[]数组中。
isPermittedAll():传入list集合,判读subject含有这些所有的权限,如果都有返回true,不是都有返回false
详情可以参考http://shiro.apache.org/authorization.html
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在 Shiro中,代表访问系统的用户,即
Subject;
编程式授权
1.1 基于角色的访问控制
封装一个shiro的util用于访问配置文件,userName和password
package com.liy.util; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; public class ShiroUtil { public static Subject login(String fileName,String userName,String password) { //读取配置文件,初始化SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory(fileName); //获取SecurityManager实例 SecurityManager securityManager=factory.getInstance(); //把securityManager实例帮定到SecurityUtils中 SecurityUtils.setSecurityManager(securityManager); //得到当前执行的用户 Subject currentUser=SecurityUtils.getSubject(); //创建token用户令牌 UsernamePasswordToken token = new UsernamePasswordToken(userName, password); try { //身份认证 currentUser.login(token); System.out.println("用户验证成功"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("用户验证失败"); } return currentUser; } }
配置一个新的ini文件jdbc_role.ini
[users] liy313=123456,role1,role2 jack=123,role1role1和role2是角色,如管理员、用户等
基于角色的控制访问有三个方法:hasRole()、hasRoles()和hasAllRoles()
hasRole():如果subject有这个角色,返回true
hasRoles():接收一个list集合,依次判断是否有这些角色,并返回hasRole的数组
hasAllRoles():传入list集合,判读subject含有这些所有的角色,如果都有返回true,不是都有返回false
package com.liy.test; import java.util.Arrays; import org.apache.shiro.subject.Subject; import com.liy.util.ShiroUtil; public class Test { @org.junit.Test public void testHasRole() { //Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456"); Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123"); System.out.println(currentUser.hasRole("role2")?"有role2权限":"没有role2权限"); } @org.junit.Test public void testHasRoles() { //Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456"); Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123"); //返回boolean数组 boolean result[]=currentUser.hasRoles(Arrays.asList("role1","role2")); System.out.println(result[0]?"有role1权限":"没有role1权限"); System.out.println(result[1]?"有role2权限":"没有role2权限"); } @org.junit.Test public void testHasAllRole() { Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "liy313", "123456"); //Subject currentUser=ShiroUtil.login("classpath:jdbc_role.ini", "jack", "123"); System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2"))?"都有":"不是都有"); } }liy313输出结果:
用户验证成功
有role2权限
用户验证成功
都有
用户验证成功
有role1权限
有role2权限
jack输出结果:
用户验证成功
没有role2权限
用户验证成功
不是都有
用户验证成功
有role1权限
没有role2权限
1.2 基于权限的访问控制
配置文件jdbc_permission.ini
[users] liy313=123456,role1,role2 jack=123,role1为每个角色分配具体权限
[roles]
role1=user:select
role2=user:add,user:update,user:delete
基于权限的访问控制有两个方法:isPermitted()和isPermittedAll()
其中isPermitted()方法可以接收的参数类型:
isPermitted(String)或isPermitted(Permission):如果含有这个权限则返回true
isPermitted(List)或isPermitted(String[]):依次判断这个集合或者数组是否含有这些权限,并把这些结果存入一个boolean[]数组中。
isPermittedAll():传入list集合,判读subject含有这些所有的权限,如果都有返回true,不是都有返回false
package com.liy.test; import org.apache.shiro.subject.Subject; import org.junit.Test; import com.liy.util.ShiroUtil; public class TestPermission { @Test public void test() { Subject currentUser=ShiroUtil.login("classpath:jdbc_permission.ini", "liy313", "123456"); //Subject currentUser=ShiroUtil.login("classpath:jdbc_permission.ini", "jack", "123"); System.out.println(currentUser.isPermitted("user:select")?"有select":"没有select"); System.out.println(currentUser.isPermitted("user:add")?"有add":"没有add"); System.out.println(currentUser.isPermitted("user:update")?"有update":"没有update"); System.out.println(currentUser.isPermitted("user:delete")?"有delete":"没有delete"); boolean result[]=currentUser.isPermitted("user:select","user:add","user:update","user:delete"); System.out.println(result[0]?"有select":"没有select"); System.out.println(result[1]?"有add":"没有add"); System.out.println(result[2]?"有update":"没有update"); System.out.println(result[3]?"有delete":"没有delete"); System.out.println(currentUser.isPermittedAll("user:select","user:update")?"都有":"不是都有"); } }
详情可以参考http://shiro.apache.org/authorization.html
相关文章推荐
- 采用shiro实现登录认证与权限授权管理
- 一头扎进Shiro-权限认证(授权)
- springmvc+shiro+maven 实现登录认证与权限授权管理
- springmvc+shiro+maven 实现登录认证与权限授权管理
- 【Shiro】Shiro从小白到大神(三)-权限认证(授权)
- springmvc+shiro+maven 实现登录认证与权限授权管理
- shiro权限认证与授权
- springmvc+shiro+maven 实现登录认证与权限授权管理
- shiro权限框架中的认证和授权过程
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- shiro权限框架中的认证和授权过程
- 基于AOP实现权限管理:通过shiro认证身份和模拟授权认证
- Shiro入门2:权限管理入门,用户认证、授权
- 学习shiro——权限认证和授权
- shiro权限框架中的认证和授权过程
- Shiro用户登录认证、权限授权示例,以及源码分析(上)
- web中采用shiro实现登录认证与权限授权管理
- JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权
- Shiro入门之一 -------- Shiro权限认证与授权
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程