一、内置过滤器
(一)内置过滤器介绍
- roles[a,b,c],必须角色都符合才可以访问
- perms[a,b],必须全部拥有该权限才可以访问
- port[a,b],必须指定端口才可以访问!!
- ####################################
- anno:无权限访问
- authc:需要认证才能访问
- user:代表需要存在该用户对象才可访问
- logout 登录退出才能被访问
(二)内置过滤器测试
<!--Shiro过滤器-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--设置Shiro的securityManager-->
<property name="securityManager" ref="securityManager"/>
<!--登录网址-->
<property name="loginUrl" value="login.html"/>
<!--未授权网址-->
<property name="unauthorizedUrl" value="403.html"/>
<!--过滤器链 anon匿名访问的路径 authc必须验证通过才能访问的路径 配置在前面的优先生效!-->
<property name="filterChainDefinitions">
<value>
/login.html = anon
/sublogin = anon
<!--只有拥有该角色,才能访问。。。-->
/testRole = roles[admin]
/testRole1 = roles[admin,user]
<!--只有拥有该权限,才能访问。。。-->
/testPermission = perms[user:delete]
/testPermission1 = perms[user:delete,user:add]
/* = authc
</value>
</property>
</bean>
二、自定义过滤器
内置过滤器的缺点:比如/testRole1 = roles[admin,user]
表示必须同时拥有admin,user
角色才可访问/testRole1
,但有时我们需要只要拥有其中一个角色即可访问,这种需求内置过滤器无法满足,所以我们需要自定义过滤器。
若是自定义认证相关的过滤器,则需要继承AuthenticationFilter
;若是自定义授权相关的过滤器,则需要继承AuthorizationFilter
。
这里以实现只要拥有其中一个角色即可访问为例进行自定义过滤器讲解。
(一)创建自定义过滤器RolesOrFilter
/**
* @author 咸鱼
* @date 2018/9/8 22:18
* RolesOrFilter作用:只要访问用户有要求的其中一个角色,即可进行访问
*/
public class RolesOrFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
//调用父类方法获取Subject对象
Subject subject = getSubject(servletRequest, servletResponse);
/**
* 自定义的过滤器会在"shiroFilter"中被配置成一个标签,比如这里的过滤器会被配置成:
* <entry key="rolesOr" value-ref="rolesOrFilter"/>
* 有了这个标签以后,我们会用该标签控制访问路径,比如“/testRole1 = rolesOr[admin,user]”,
* 而这里的Object参数就是admin,user角色数组。
*/
String[] roles = (String[]) o;
if (roles != null && roles.length != 0){
for (String role : roles){
//判断访问主体是否有该角色
if (subject.hasRole(role)){
return true;
}
}
}
return false;
}
}
(二)配置自定义过滤器
<!--Shiro过滤器-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--设置Shiro的securityManager-->
<property name="securityManager" ref="securityManager"/>
<!--登录网址-->
<property name="loginUrl" value="login.html"/>
<!--未授权网址-->
<property name="unauthorizedUrl" value="403.html"/>
<!--过滤器链 anon匿名访问的路径 authc必须验证通过才能访问的路径 配置在前面的优先生效!-->
<property name="filterChainDefinitions">
<value>
/login.html = anon
/sublogin = anon
/testRole = roles[admin,user]
/testRole1 = rolesOr[admin,user]
/testPermission = perms[user:delete]
/testPermission1 = perms[user:delete,user:add]
/* = authc
</value>
</property>
<!--将自定义过滤器配置成标签-->
<property name="filters">
<util:map>
<entry key="rolesOr" value-ref="rolesOrFilter"/>
</util:map>
</property>
</bean>
<!--自定义过滤器-->
<bean id="rolesOrFilter" class="org.pc.filter.RolesOrFilter"/>