Shiro-授权
  TEZNKK3IfmPf 2023年11月14日 22 0
  • 授权,即访问控制,控制谁能访问哪些资源。
  • 主体进行身份认证后需要分配权限,方可访问系统的资源,对于某些资源没有权限是无法访问的这就是授权。

使用 ini 的形式配置权限信息

  • 在 ini 文件中设置用户、角色、权限的配置规则。
  • 用户名=密码,角色1,角色2 ...
  • 首先根据用户名找角色,再根据角色找权限,角色是权限集合。
  • 权限字符串的规则
  • “资源标识符:操作:资源实例标识符”
  • 对哪个资源的哪个实例具有什么操作。
  • ​:​​ 是资源 / 操作 / 实例的分割符。
  • 权限字符串也可以使用​​*​​ 通配符。

如下将给出一个配置示例如下所示,修改 shiro.ini:

[users]
#用户bntang的密码是1234,此用户具有role1和role2两个角色
#用户jonathan_lee的密码是1234,此用户具有role2一个角色
bntang=1234,role1,role2
jonathan_lee=1234,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

自定义 Realm 的形式权限

修改 ​​MyRealm.java​

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 获取身份信息
Object principal = principals.getPrimaryPrincipal();

// 根据用户名查询该用户的角色和权限
List<String> roles = new ArrayList<>();
roles.add("role1");
roles.add("role2");

List<String> permissions = new ArrayList<>();
permissions.add("user:create");
permissions.add("user:delete");

// 把角色和权限与 subject 关联在一起,然后进行返回
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRoles(roles);
info.addStringPermissions(permissions);
return info;
}

Shiro-授权

然后修改之前的测试类,具体修改的内容或者新增的内容如下代码所示, 在认证成功之后才去做授权, 判断当前的用户是否有某一个角色和某一个权限

/**
* @author BNTang
*/
public class Demo {

public static void main(String[] args) {
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");

SecurityManager securityManager = factory.getInstance();

SecurityUtils.setSecurityManager(securityManager);

Subject subject = SecurityUtils.getSubject();

UsernamePasswordToken token = new UsernamePasswordToken("BNTang", "12345");

try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("用户名不存在");
e.printStackTrace();
} catch (IncorrectCredentialsException e) {
System.out.println("密码错误");
e.printStackTrace();
}

System.out.println("是否认证" + subject.isAuthenticated());

subject.logout();

System.out.println("是否认证" + subject.isAuthenticated());

// 判断当前用户有没有角色1
System.out.println(subject.hasRole("role1"));

// 判断当前用户是否同时具备多个角色
System.out.println(subject.hasAllRoles(Arrays.asList("role1", "role3")));

// 判断是否有某一个权限
System.out.println(subject.isPermitted("user:create"));

// 判断是否同时有多个权限
System.out.println(subject.isPermittedAll("user:create", "user:update"));
}
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   41   0   0 权限java
  TEZNKK3IfmPf   2023年11月15日   42   0   0 shiromongodb
  TEZNKK3IfmPf   2023年11月14日   35   0   0 权限mysql
  TEZNKK3IfmPf   2023年11月15日   42   0   0 shiro
  TEZNKK3IfmPf   2023年11月14日   23   0   0 权限shiro
  TEZNKK3IfmPf   2024年05月17日   50   0   0 权限dremio
TEZNKK3IfmPf