Shiro(四)——通过注解实现权限拦截(基于角色和基于权限)、Shiro的Jsp标签、Shiro 缓存

一、通过注解实现权限拦截

1、粗粒度和细粒度的权限控制

上篇博客中,通过 URL地址进行权限控制,属于粗粒度的权限控制。
基于过滤器来实现的基本上都是粗粒度的权限控制。因为一个页面中可能有很多请求,可能 A 方法允许你调用,但是 B 方法就不允许了,但是他们都属于一个页面,那么仅靠之前的 url 来控制就不能实现。

如果是基于注解实现的权限控制,可以精确到每一个 service 方法,底层实现的是 AOP。所以细粒度的权限控制一般在 service 层实现。

权限保存在数据库中,其实从技术角度来讲,权限也就是一堆字符串,用来判断有无权限其实也就是判断有没有这堆字符串。

2、基于角色访问功能

先完成 controller 层代码和 service 层代码:

controller 层:
在这里插入图片描述

service 层:
相关注解好几个,看注释(需要什么功能就用什么注解即可):
在这里插入图片描述
这里先用角色测试:
在这里插入图片描述
因为底层是 AOP,所以还要配置 AOP 两个工具:
在这里插入图片描述
基本到这就可以了。

如果是跟着博客的代码打的话,前面有些代码需要修改一下,不然会报 500 错误:
在这里插入图片描述
在这里插入图片描述
如果没有对应的角色,会触发这个页面:
在这里插入图片描述

3、基于权限访问功能

前面是基于角色的,接着演示基于权限的:
在这里插入图片描述
那么怎么知道角色有没有这些去权限呢?还是去 MyRealm 里面去配置:
在这里插入图片描述
接着就是查询权限:
mapper 层:
在这里插入图片描述

在这里插入图片描述
那么到这里就完成了。

二、Shiro的Jsp标签

1、jsp标签

在这里插入图片描述
在这里插入图片描述

2、其他 jsp 标签

在这里插入图片描述

三、Shiro 缓存

1、配置缓存

一般来说用户不会很频繁的登录,所以一般是不需要频繁的去获取权限,但是如果某些功能需要权限,那么每次一用这个功能都会很频繁的去查数据库,这样就会造成性能下降。所以如果权限数据不会很轻易的变化情况下,如果有个缓存,就能大大缓解压力。

Shiro 提供了一个缓存工具:

先导入依赖:
在这里插入图片描述
然后接收新建配置文件:
在这里插入图片描述

里面写缓存策略:
在这里插入图片描述

<ehcache>
    <diskStore path="java.io.tmpdir/shiro-spring-sample"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
    />
    <cache name="shiro-activeSessionCache"
           maxElementsInMemory="10000"
           eternal="true"
           overflowToDisk="true"
           diskPersistent="true"
           diskExpiryThreadIntervalSeconds="600"/>
    <cache name="org.apache.shiro.realm.SimpleAccountRealm.authorization"
           maxElementsInMemory="100"
           eternal="false"
           timeToLiveSeconds="600"
           overflowToDisk="false"/>
</ehcache>

接着就是在 Spring 里面配置:
在这里插入图片描述在这里插入图片描述
最后在 myRealm 里面配置:
在这里插入图片描述
到此就配置完成了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Shiro权限拦截实现主要分为两个部分,一是定义自己的Realm实现类,二是在Shiro的配置文件中配置过滤器链。 1. 定义自己的Realm实现类 在自定义的Realm实现类中,需要重写doGetAuthorizationInfo方法来授权用户的访问权限。该方法会在用户登录成功后进行调用,并返回该用户所具有的角色权限信息。在该方法中,可以通过调用Subject对象的getPrincipal方法来获取当前用户的身份信息,然后根据用户的身份信息查询数据库或者其他数据源,获取该用户所具有的角色权限信息。最后将角色权限信息封装到一个SimpleAuthorizationInfo对象中并返回。 ``` public class MyRealm extends AuthorizingRealm { /** * 获取用户授权信息 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 查询用户角色权限信息 Set<String> roles = new HashSet<>(); roles.add("admin"); authorizationInfo.setRoles(roles); Set<String> permissions = new HashSet<>(); permissions.add("user:add"); authorizationInfo.setStringPermissions(permissions); return authorizationInfo; } /** * 获取用户认证信息 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // ... } } ``` 2. 配置过滤器链 在Shiro的配置文件中,通过配置过滤器链来实现权限拦截。在过滤器链中,可以根据URL路径的不同设置不同的过滤器来实现不同的拦截效果。 例如,我们可以使用authc过滤器来拦截需要认证的URL路径,使用perms过滤器来拦截需要特定权限才能访问的URL路径,使用roles过滤器来拦截需要特定角色才能访问的URL路径。具体的配置如下: ``` [urls] /login = anon /logout = logout /user/** = authc, perms[user:manage] /admin/** = authc, roles[admin] ``` 上述配置表示: - /login路径可以匿名访问 - /logout路径需要登录并且执行登出操作 - /user/**路径需要登录,并且需要user:manage权限才能访问 - /admin/**路径需要登录,并且需要admin角色才能访问 通过以上配置,就可以实现Shiro权限拦截功能。如果用户没有登录或者没有特定的角色权限,就无法访问被拦截的URL路径。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值