(三)shiro权限认证(授权)
来源:互联网 发布:宏观经济信息数据库 编辑:程序博客网 时间:2024/06/05 02:28
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在 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;}}
[users]liy313=123456,role1,role2jack=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.Testpublic 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.Testpublic 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.Testpublic 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,role2jack=123,role1[roles]role1=user:selectrole2=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 {@Testpublic 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】Shiro从小白到大神(三)-权限认证(授权)
- 权限项目总结(三) shiro 认证
- 一头扎进Shiro-权限认证(授权)
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
- java安全框架-Shiro学习笔记(三)-权限认证
- shiro权限框架中的认证和授权过程
- Shiro入门2:权限管理入门,用户认证、授权
- 采用shiro实现登录认证与权限授权管理
- shiro 权限框架认证和授权原理介绍
- shiro权限框架中的认证和授权过程
- springmvc+shiro+maven 实现登录认证与权限授权管理
- springmvc+shiro+maven 实现登录认证与权限授权管理
- springmvc+shiro+maven 实现登录认证与权限授权管理
- shiro权限框架中的认证和授权过程
- Apache Shiro 使用手册(三)Shiro 授权
- Apache Shiro 使用手册(三)Shiro 授权
- Java实现冒泡排序算法
- Java synchronized详解
- HDU - 1244 Max Sum Plus Plus Plus
- bzoj 4300 绝世好题(dp)
- [leetcode]Count of Range Sum
- (三)shiro权限认证(授权)
- android ViewPager自动轮播时控制切换速度
- js代码分析
- Homebrew
- 判断一个字符串是否为另外一个字符串左旋或右旋之后的字符串。
- 热力学的认识
- java集合04--fail fast机制原理以及解决办法
- 基于四元数的简单互补滤波姿态解算
- 存储过程与事务案例