shiro第三课
来源:互联网 发布:erp软件排名 编辑:程序博客网 时间:2024/05/31 04:04
权限认证核心要素
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户;
权限,即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色,是权限的集合,一中角色可以包含多种权限;
用户,在Shiro 中,代表访问系统的用户,即Subject;
授权
1,编程式授权
1.1 基于角色的访问控制
-------------------------------认证公共类
public class ShiroUtil {
public static Subject login(String configFile, String userName, String password) {
// 读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
// 获取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;
}
}
----------------------------------shiro_role.ini 文件
[users]
java=123456,role1,role2
dt=123,role1
-----------------------------test类
@Test
public void test(){
Subject subject = ShiroUtil.login("classpath:shiro_role.ini", "java", "123456");
System.out.println(subject.hasRole("role1")?"有":"没有");
boolean[] result = subject.hasRoles(Arrays.asList("role1","role2","role3"));
System.out.println(result[0]);
System.out.println(result[1]);
System.out.println(result[2]);
}
1.2 基于权限的访问控制
-------------------------------shiro_permission.ini 文件
[users]
java1234=123456,role1,role2
jack=123,role1
[roles]
role1=user:select
role2=user:add,user:update,user:delete
----------------------------------test
@Test
public void testIsPermitted() {
Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "java", "123456");
// Subject currentUser=ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123");
System.out.println(currentUser.isPermitted("user:select")?"有user:select这个权限":"没有user:select这个权限");
System.out.println(currentUser.isPermitted("user:update")?"有user:update这个权限":"没有user:update这个权限");
boolean results[]=currentUser.isPermitted("user:select","user:update","user:delete");
System.out.println(results[0]?"有user:select这个权限":"没有user:select这个权限");
System.out.println(results[1]?"有user:update这个权限":"没有user:update这个权限");
System.out.println(results[2]?"有user:delete这个权限":"没有user:delete这个权限");
System.out.println(currentUser.isPermittedAll("user:select","user:update")?"有user:select,update这两个权限":"user:select,update这两个权限不全有");
currentUser.logout();
}
2,注解式授权
@RequiresAuthentication 要求当前Subject 已经在当前的session 中被验证通过才能被访问或调用。
@RequiresGuest 要求当前的Subject 是一个"guest",也就是说,他们必须是在之前的session 中没有被验证或被记住才
能被访问或调用。
@RequiresPermissions("account:create") 要求当前的Subject 被允许一个或多个权限,以便执行注解的方法。
@RequiresRoles("administrator") 要求当前的Subject 拥有所有指定的角色。如果他们没有,则该方法将不会被执行,而
且AuthorizationException 异常将会被抛出。
@RequiresUser RequiresUser 注解需要当前的Subject 是一个应用程序用户才能被注解的类/实例/方法访问或调用。一个“应
用程序用户”被定义为一个拥有已知身份,或在当前session 中由于通过验证被确认,或者在之前session 中的'RememberMe'
服务被记住。
3,Jsp 标签授权
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
Guest 标签:用户没有身份验证时显示相应信息,即游客访问信息;
User 标签:用户已经身份验证/记住我登录后显示相应的信息;
Authenticated 标签:用户已经身份验证通过,即Subject.login 登录成功,不是记住我登录的。
notAuthenticated 标签:用户没有身份验证通过,即没有调用Subject.login 进行登录,包括记住我自动登录
的也属于未进行身份验证。
principal 标签显示用户身份信息,默认调用Subject.getPrincipal()获取,即Primary Principal。
hasRole 标签如果当前Subject 有角色将显示body 体内容。
lacksRole 标签如果当前Subject 没有角色将显示body 体内容。
hasAnyRoles 标签如果当前Subject 有任意一个角色(或的关系)将显示body 体内容。
hasPermission 标签如果当前Subject 有权限将显示body 体内容。
lacksPermission 标签如果当前Subject 没有权限将显示body 体内容。
- shiro第三课
- 跟我学shiro,第三课
- 第三章 Shiro授权
- shiro学习第三章
- 第三章:Shiro的配置
- 【apache shiro第三篇】Apache Shiro 10分钟教程
- [第三章]shiro 授权
- Shiro第三篇【授权、自定义reaml授权】
- shiro第一课
- shiro第二课
- shiro第四课
- shiro
- shiro
- Shiro
- shiro
- shiro
- shiro
- shiro
- 434. Number of Segments in a String
- Spark算子执行流程详解之七
- 将本地项目上传到GitHub
- C# 静态方法与动态方法
- Spring Boot+AngularJS+BootStrap实现进度条
- shiro第三课
- 可并堆-bzoj2809: [Apio2012]dispatching
- spring 事务
- 三分钟,如何说好自我介绍?
- pat-a1054. The Dominant Color (20)
- php AES 加解密方法使用函数了解
- 开启博客之旅
- css用@media适配不同尺寸的手机布局方式
- 蓝牙Setting和Framwork简介