1、授权需要继承 AuthorizingRealm 类, 并实现其 doGetAuthorizationInfo 方法(也可认证)
public class MyRealm extends AuthorizingRealm
2、实现doGetAuthorizationInfo方法
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//1、从PrincipalCollection中获取登入的用户信息
Object principal = principalCollection.getPrimaryPrincipal();
//2、利用登录的用户信息来查看当前用户的角色或权限(从数据库中读取)
//默认通过认证都有user这个角色
Set<String> roles = new HashSet<>();
roles.add("user");
//如果是用admin登录则可以在拥有admin这个角色
if("admin".equals(principal)){
roles.add("admin");
}
//3、创建SimpleAuthorizationInfo,并设置其roles属性
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(roles);
//4、返回SimpleAuthorizationInfo对象
return authorizationInfo;
}
3、需要在配置文件中的shiroFilter中配置权限或角色(不止有这一种方式)
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/to_login"/>
<!-- 登录成功跳转页面 -->
<property name="successUrl" value="/list"/>
<!-- 未授权跳转页面 -->
<property name="unauthorizedUrl" value="/unauthorized"/>
<!-- <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property>-->
<!--
配置哪些页面需要受保护.(满足ant风格)
以及访问这些页面需要的权限.
1). anon 可以被匿名访问
2). authc 必须认证(即登录)后才可能访问的页面.
3). logout 登出.
4). roles 角色过滤器
-->
<property name="filterChainDefinitions">
<value>
/login = anon
/to_login = anon
/logout = logout
/unauthorized = anon
/list = roles[user]
/user = roles[user]
/admin = roles[admin]
# everything else requires authentication:
/** = authc
</value>
</property>
</bean>
4、运行效果
先用user登录,访问admin页面会跳转到未授权页面
用admin登录,则有admin页面的权限,则不会跳转到未授权页面