上一章节我给大家讲了如何设计扩展动态修改shiro的资源而不用重启项目,这个章节我讲的是如何自定义我们的特殊过滤器
讲到认证这一块,我们经常用到就是authc,roles,perms这三个标签,说到底标签其实就是一个map的key,然后指向filter实例,相信大家都懂这个了,所以我就不啰嗦,下面我们看看roles的filter实现类
- package org.apache.shiro.web.filter.authz;
-
- import java.io.IOException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import org.apache.shiro.subject.Subject;
- import org.apache.shiro.util.CollectionUtils;
-
- // Referenced classes of package org.apache.shiro.web.filter.authz:
- // AuthorizationFilter
-
- public class RolesAuthorizationFilter extends AuthorizationFilter
- {
-
- public RolesAuthorizationFilter()
- {
- }
-
- public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
- throws IOException
- {
- Subject subject = getSubject(request, response);
- String rolesArray[] = (String[])(String[])mappedValue;
- if(rolesArray == null || rolesArray.length == 0)
- {
- return true;
- } else
- {
- java.util.Set roles = CollectionUtils.asSet(rolesArray);
- return subject.hasAllRoles(roles);
- }
- }
- }
我们可以看到其实这个roles的filter是通过subject.hasAllRoles(roles)判断是否满足所有权限,但是我们真实项目中,很多时候用户只要满足其中一个角色即可认为是授权认证成功,所以这个时候,我们首先想到的是再写个filter吧,那我们下面就写个满足任一角色即可放行的授权认证类
- public class RoleAuthorizationFilter extends AuthorizationFilter {
-
- public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
- throws IOException {
-
- Subject subject = getSubject(request, response);
- String[] rolesArray = (String[]) mappedValue;
-
- if (rolesArray == null || rolesArray.length == 0) {
- // no roles specified, so nothing to check - allow access.
- return true;
- }
-
- Set<String> roles = CollectionUtils.asSet(rolesArray);
- for (String role : roles) {
- if (subject.hasRole(role)) {
- return true;
- }
- }
- return false;
- }
-
- }
很简单的样子,其实就是从RolesAuthorizationFilter这个类copy一份代码过来,然后把subject.hasAllRoles()换成遍历调用subject.hasRole()方法,如存在任一角色则返回true即可
最后我们把这个filter要配置到主过滤器里,并且定义标签为role
- <!-- 过滤链配置 -->
- <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
- <property name="securityManager" ref="securityManager" />
- <property name="loginUrl" value="/" />
- <property name="successUrl" value="/cms/index.do" />
- <property name="unauthorizedUrl" value="/" />
- <property name="filters">
- <map>
- <entry key="role">
- <bean
- class="com.silvery.security.shiro.filter.RoleAuthorizationFilter" />
- </entry>
- <entry key="authc">
- <bean
- class="com.silvery.security.shiro.filter.SimpleFormAuthenticationFilter" />
- </entry>
- </map>
- </property>
- </bean>
象上述配置就是使用自定义过滤器,如: /test/** = role[admin] 或者 /test/** = role[admin,user] 这样用户拥有任一定义的角色都能认证成功
由上述的自定义filter可以看出,我们在shiro上增加其他filter并不难,所以如果需要增加其他filter就不需要担心实现不了...
|