Shiro系列-Shiro的怎么进行授权操作

导语
  之前的分享中,提到了Shiro的简单介绍,知道了Shiro是什么,作用是什么,以及用户身份认证。那么完成用户身份认证之后又需要干点啥呢?在用户身份认证之后接下来就要要根据用户身份角色信息进行授权操作,也就是说那些资源或者那些操作是用户可以访问的,那些资源是不可以使用的。那么接下来就来看看Shiro授权怎么实现

项目代码路径

Shiro授权概念

  授权,也叫访问控制,也就是说在应用中控制那些用户可以访问对应的资源操作,在授权操作中有几个关键对象,主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。接下来就来分别看看这些对象都是什么

主体(Subject)

  也就是访问应用的用户,在Shiro中时使用的是Subject代表,之前的分享中也提到过这个概念,只有当授权成功之后才会被允许访问对应的资源。

资源(Resource)

  在应用中可以访问的任何东西,例如一个HTML页面,或者是某张图片、访问某个业务场景。当用户授权之后才能被访问。

权限(Permission)

  安全策略中的原子性授权单位,通过权限可以表示在应用中那些用户对于某些资源有那些权力进行操作,也就是说表示用户能不能活着说可不可以访问那些资源。例如用户对于资源的CRUD操作。

角色(Role)

  角色代表是一类操作的集合,可以理解为权限的集合,一般情况下会赋予用户某些角色,而不是直接赋予权限,也就是说通过角色的控制可以赋予用户一组权限,比直接给用户赋予权限更加方便。

隐式角色

  直接通过角色来验证用户有没有操作权限,粒度是以角色为单位进行访问控制的,粒度较粗。

显式角色

  在程序中通过权限控制谁能访问某个资源,角色聚合一组权限,也就是说粒度是以资源/实例为单位的,粒度较细。

授权方式有那些

  在Shiro中支持三种方式的授权操作,编程式,注解式,JSP/GSP 标签。下面就来简单的说说这三种

编程式

  通过写if/else授权代码块完成

Subject subject = SecurityUtils.getSubject();
if(subject.hasRole("admin")){
	//有权限
}else{
	//无权限
}

注解式

  通过在执行的Java方法上放置相应的注解来完成

@RequiresRoles("admin")
public void hello(){
	//有权限
}

注意:如果没有权限将抛出相应的异常

JSP/GSP 标签

  在前端框架代码中通过相应的标签完成

<shiro:hasRole name="admin">
//有权限
</shiro:hasRole>

注意 在Thymeleaf模板中也引入了对于Shiro的支持可以直接使用。

如何进行授权操作

基于角色的访问控制(隐式角色)

1、在配置文件中配置用户以及现在拥有的角色

[users]
nihui=123,role1,role2
test=123,role1

配置规则:
用户名=密码,角色1,角色2

  如果需要在实际应用中对应响应的角色就需要在对应的Realm上返回对应的角色信息,还是之前说的Shiro并不会维护用户-角色对应信息,需要开发者自己来维护这套信息,Shiro只是提供了对应的验证接口。

2、编写测试用例

public class AuthenticatorTest {
    public static void main(String[] args) {
        //测试成功
        login("classpath:shiro-role.ini");
    }
    private static void login(String configFile){
        //获取SecurityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
        //获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //绑定SecurityManager
        SecurityUtils.setSecurityManager(securityManager);
        //设置主体
        Subject subject = SecurityUtils.getSubject();
        //设置验证登陆token
        UsernamePasswordToken token = new UsernamePasswordToken("test","123");
        //登陆
        subject.login(token);
        System.out.println(subject.isAuthenticated());
        System.out.println("test 是否拥有 role1 "+subject.hasRole("role1"));
        System.out.println("test 是否拥有 role2 "+subject.hasRole("role2"));
        subject.logout();
    }
}

测试结果
在这里插入图片描述

  从上面的例子可以看到Shiro其实提供了角色检查的操作。在后面的分享中再介绍关于如何获取用户角色。到此,基于用户角色访问控制(隐式角色)测试就完成了,这种方式的缺点就是如果项目中很多地方都进行了角色判断,那么需要改动的代码量就比较大,很难实现解耦的操作。

基于资源的控制访问(显示角色)

  基于资源的角色访问控制,是在工作中经常使用的一种权限控制方式。下面就来看看它是如何实现的

1、在配置文件中创建用户拥有的角色以及角色权限关系

[users]
nihui=123,role1,role2
test=123,role1
[roles]
role1=user:create,user:update
role2=user:create,user:delete

匹配的规则就是
用户名=密码,角色1,角色2
角色=权限1,权限2

  也就是说首先要根据用户名找到对应的用户,并且得到用户所对应的角色,然后再根据用户角色找到对应的操作权限,Shiro同样也不支持权限的维护,也是需要Realm进行返回对应的权限信息。

2、测试类编写

public class Authenticator {
    public static void main(String[] args) {
        //测试成功
        login("classpath:shiro-permission.ini");
    }
    private static void login(String configFile){
        //获取SecurityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile);
        //获取SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //绑定SecurityManager
        SecurityUtils.setSecurityManager(securityManager);
        //设置主体
        Subject subject = SecurityUtils.getSubject();
        //设置验证登陆token
        UsernamePasswordToken token = new UsernamePasswordToken("test","123");
        //登陆
        subject.login(token);
        System.out.println(subject.isAuthenticated());
        System.out.println("test 是否拥有 role1 "+subject.hasRole("role1"));
        System.out.println("test 是否拥有 role2 "+subject.hasRole("role2"));
        System.out.println("test 是否拥有删除权限"+subject.isPermitted("user:delete"));
        System.out.println("test 是否拥有更新权限"+subject.isPermitted("user:update"));
        subject.logout();
    }
}

测试结果
在这里插入图片描述
  显示角色配置的测试效果已经有了,这种方式的一般规则就是“资源标识符:操作”,也就是对于资源操作是细粒度的,这种方式的好处就是所有的修改都是资源级别的,不会对其他代码产生影响,粒度小。但是这种方式的实现复杂度较高,例如需要维护用户信息,用户角色信息,用户角色关联信息,角色权限关联信息等一系列的操作。

总结

  上面的内容分享了什么是授权操作,怎么样进行授权操作,通过两个例子分别展示了显式权限操作和隐式权限操作。但是如果需要设计出更加优质的用户权限系统,还要结合Realm进行控制,作为用户安全数据源,对于Realm的操作才是权限控制的核心基础。本次代码路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值