Shiro入门9:Shiro授权流程和三种授权方式和权限标识符规则
来源:互联网 发布:易语言彩票预测源码 编辑:程序博客网 时间:2024/06/06 12:28
|---Shiro授权流程
|---构造SecurityManager环境
|---Subject.isPermited()授权
|---SecurityManager.isPermited()执行授权
|---Authorizer执行授权
|---Realm根据身份获取资源权限信息
此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51019451
更多有关老猫的文章:http://blog.csdn.net/nthack5730
三种授权方式
编程式:通过写if/else授权代码快完成
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
} else{
//无权限
}
注解式:通过在执行的JAVA方法上放置相应的注解完成
@RequiresRoles("admin")
public void hello(){
//有权限
}
JSP/GSP标签:在JSP/GSP页面通过相应的标签完成
<shiro:hasRole name="admin">
<!-- 有权限 -->
</shiro:hasRole>
需要ini配置文件:shiro-permission.ini【相当于在数据库】
shiro-permission.ini
#用户
[users]
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2
#权限
[roles]
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
关于上面的权限标识符,下面有对应的解释
权限标识符号规则:【中间用“:”(半角冒号分隔)】
|---资源:操作【user:create:表示对用户资源进行create操作】【等价于:user:create:*(对所有的用户实例进行操作)】
|---资源:操作:实例【user:create:01:表示对用户资源的01实例进行create操作】
|
|---例子:【user:*:01表示对用户资源的01实例进行所有操作】
静态、Junit测试类
import java.util.Arrays;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.Test;
public classAuthorizationTest {
//授权测试:角色授权、资源授权
@Test
public void testAuthorization(){
//创建一个SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-perimission.ini");
//创建SecurityManager
SecurityManager sm = factory.getInstance();
//将SecurityManager设置到系统运行环境,和Spring整合后将SecurityManager配置到Spring容器中,一般单例管理
SecurityUtils.setSecurityManager(sm);
//创建Subject
Subject subject = SecurityUtils.getSubject();
//创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","11111");
//执行认证
try {
subject.login(token);
} catch (AuthenticationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("认证状态:" + subject.isAuthenticated());
//认证通过后执行授权
//===========================================
// 基于角色授权
//===========================================
//hasRole方法传入的是角色标识
boolean isHasRole = subject.hasRole("role1");
System.out.println("正确角色,角色有权限--->" + isHasRole);
//传入错误的角色
boolean isHasRole2 = subject.hasRole("role12");
System.out.println("错误角色,角色有权限--->" + isHasRole2);
//判断多个角色
boolean hasAllRoles = subject.hasAllRoles(Arrays.asList("role1","role2"));
System.out.println("多个角色判断--->" + hasAllRoles);
//使用check方法进行授权,如果不通过,会抛出异常
// try {
// subject.checkRole("role12");
// } catch (AuthorizationException e) {
// // TODO 自动生成的 catch 块
// e.printStackTrace();
// }
//===========================================
// 基于资源授权
//===========================================
//传入的是资源标识符,单个权限判断
boolean isPermited = subject.isPermitted("user:create:1");
System.out.println("资源有权限,单个权限判断--->" + isPermited);
//传入的是资源标识符,多个权限判断
boolean isPermitedAll = subject.isPermittedAll("user:create","user:update","user:delete");
System.out.println("资源有权限,多个权限判断--->" + isPermitedAll);
//资源权限也支持check,如果不通过,也会抛异常
try {
subject.checkPermission("item:create");
} catch (AuthorizationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
subject.getPrincipal();
}//method
}
此文老猫原创,转载请加本文连接:http://blog.csdn.net/nthack5730/article/details/51019451
更多有关老猫的文章:http://blog.csdn.net/nthack5730
2 0
- Shiro入门9:Shiro授权流程和三种授权方式和权限标识符规则
- 【shiro】授权和认证流程
- shiro身份验证和授权入门
- Shiro认证流程和授权流程
- shiro身份验证和授权
- Shiro授权的三种方式
- shiro认证授权流程
- Shiro案例---认证和授权
- 【Shiro权限管理】15.Shiro授权流程分析
- (三)shiro权限认证(授权)
- shiro身份验证授权入门
- shiro授权入门程序
- Shiro入门-授权初步
- shiro授权入门程序
- 五.shiro授权入门
- Shiro入门—授权
- Apache Shiro (三) ---- 授权
- 【Shiro】Shiro从小白到大神(三)-权限认证(授权)
- SharedPreferences
- FZU 2124 FOJ 2124 吃豆人【BFS】
- 关于大型网站技术演进的思考(三)--存储的瓶颈(3)
- codeforces 489B
- 在centos上搭建svn服务器
- Shiro入门9:Shiro授权流程和三种授权方式和权限标识符规则
- 2014山东省第五届ACM省赛 Circle
- shell教程五:引号与函数
- C++作业2
- AndroidStudio项目交付(更新)到github最详细步骤
- 2016年3月英语总结
- poj 2987 Firing 最大权闭合子图
- 关于大型网站技术演进的思考(二)--存储的瓶颈(2)
- PCL系列——如何可视化深度图像