shiro入门demo(二)授权
2023-12-13 14:53:55
在前面认证的基础上,认证通过后一般还有个授权的操作。授权根据业务需求有两种维度,基于角色的授权和基于资源的授权。
一、授权-基于角色授权:
? shiro中授权实现方式:有三种
1、编程式
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
//有权限
} else {
//无权限
}
编程式又有两种方式:
(1)hasRole、hasAllRoles 返回值true/false
(2)checkRole、checkRoles 只要验证失败就报异常
2、注解式
@RequiresRoles("admin")
public void hello() {
//有权限
}
3、标签式
JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
<shiro:hasRole name="admin">
<!— 有权限—>
</shiro:hasRole>
注意: Thymeleaf 中使用shiro需要额外集成!
?这里看下第一种编程式
1、配置文件mock数据实现:
? 新建shiro-user-role.ini配置文件
[users]
zs=123,role1
ls=123,role2
admin=123,role1,role2
?单元测试
/**
* 以admin/123用户为例
*/
@Test
public void testRole(){
//1、创建SecurityManagerFactory 读取ini数据源文件
IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user-role.ini");
//2、创建安全管理器SecurityManager
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//3、通过SecurityUtil获取登入用户主体subject
Subject subject = SecurityUtils.getSubject();
//4、创建登入令牌token
UsernamePasswordToken token=new UsernamePasswordToken(
"admin", "123"
);
//用户认证(shiro的核心功能之一)
try {
//异常
//1.org.apache.shiro.authc.UnknownAccountException:账号错误异常
//2.org.apache.shiro.authc.IncorrectCredentialsException:密码错误异常
//3.org.apache.shiro.authz.UnauthorizedException: 授权错误异常
subject.login(token);
System.out.println("认证成功");
} catch (AuthenticationException e) {
System.out.println("认证失败");
e.printStackTrace();
}
//角色验证
try {
//方式一:hasRole 返回值true/false
if (subject.hasRole("role1")) {
System.out.println("角色验证成功");
} else {
System.out.println("角色验证失败");
}
//方式二:checkRole 只要验证失败就报异常
//subject.checkRole("role1");
//System.out.println("角色验证成功");
//hasRoles: 参数List集合 返回boolean数组 返回顺序与传递顺序一一对应 传普通用户,高级用户,管理员 返回false,false,true
//hasAllRoles: 参数Collection集合 返回true/false 如果有一个角色验证失败就返回false
} catch (Exception e) {
System.out.println("角色验证失败");
e.printStackTrace();
}
//7、安全退出
subject.logout();
}
输出:认证成功?角色验证成功;
密码错误,角色正确,输出:
密码正确,改成错误的角色,输出:
二、授权-基于资源授权?:
? 资源权限验证有两种方式:
(1)isPermitted、isPermittedAll方式,返回值true/false
(2)checkPermission、checkPermissions方式,只要验证失败就报异常
4、Permission字符串通配符权限:
(1)规则:资源标志符:操作:对象实例id;
(2)*表示任意资源/操作/实例。
1、配置文件实现:
? 新建shiro-user-role-permisson.ini配置文件:
[users]
zs=123,role1
ls=123,role2
admin=123,role1,role2,role4
[roles]
role1=system:user:add
role2=system:user:add,system:user:select
role3=system:user:add,system:user:select,system:user:update,system:user:delete
role4=system:*:*
? 单元测试:在前面的基础上加上资源权限验证即可
/**
* 以admin/123用户为例
*/
@Test
public void testRole(){
//1、创建SecurityManagerFactory 读取ini数据源文件
IniSecurityManagerFactory factory=new IniSecurityManagerFactory("classpath:shiro-user-role-permisson.ini");
//2、创建安全管理器SecurityManager
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//3、通过SecurityUtil获取登入用户主体subject
Subject subject = SecurityUtils.getSubject();
//4、创建登入令牌token
UsernamePasswordToken token=new UsernamePasswordToken(
"admin", "123"
);
//用户认证(shiro的核心功能之一)
try {
//异常
//1.org.apache.shiro.authc.UnknownAccountException:账号错误异常
//2.org.apache.shiro.authc.IncorrectCredentialsException:密码错误异常
//3.org.apache.shiro.authz.UnauthorizedException: 授权错误异常
subject.login(token);
System.out.println("认证成功");
} catch (AuthenticationException e) {
System.out.println("认证失败");
e.printStackTrace();
}
//角色验证
try {
//方式一:hasRole 返回值true/false
if (subject.hasRole("role3")) {
System.out.println("角色验证成功");
} else {
System.out.println("角色验证失败");
}
//方式二:checkRole 只要验证失败就报异常
//subject.checkRole("role1");
//System.out.println("角色验证成功");
//hasRoles: 参数List集合 返回boolean数组 返回顺序与传递顺序一一对应 传普通用户,高级用户,管理员 返回false,false,true
//hasAllRoles: 参数Collection集合 返回true/false 如果有一个角色验证失败就返回false
} catch (Exception e) {
System.out.println("角色验证失败");
e.printStackTrace();
}
try {
//isPermitted方式
if (subject.isPermitted("system:user:update")) {
System.out.println("权限验证成功");
} else {
System.out.println("权限验证失败");
}
//checkPermission方式
//subject.checkPermission("system:user:update");
//System.out.println("权限验证成功");
} catch (Exception e) {
System.out.println("权限验证失败");
e.printStackTrace();
}
//7、安全退出
subject.logout();
}
输出
输入错误的权限如system1:user:update,报错:
2、?
文章来源:https://blog.csdn.net/w_t_y_y/article/details/134964339
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!