shiro权限拦截的实现
时间: 2023-07-07 07:13:44 浏览: 105
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路径。
阅读全文