shiro 实现自定义权限规则校验
<span style="font-family: Arial, Helvetica, sans-serif;">在系统中使用shiro进行权限管理,当用户访问没有权限的资源时会跳转到指定的登录url。</span>
但是如果系统中支持手机app,手机访问时没有使用session进行登录凭证管理,而是使用token,有两种解决方法:
1:支持手机客户端访问的资源在权限配置中配置成anon
2:实现自定义认证拦截器,对用户请求资源进行认证
显然第一种方法不适用,这些资源应该只能让我们自己的app进行访问。
第二中实现方式:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <!-- 登录的页面 -->
    <property name="loginUrl" value="/login/login.jsp" />
    <property name="successUrl" value="/success.jsp" />
    <property name="unauthorizedUrl" value="/error.jsp" />
    <property name="filterChainDefinitions">
      <value>
        /android.html**=anon
        /pets/android**=android
        /pets/login/**=anon
        /**=authc
      </value>
    </property>
    <property name="filters">
      <map>
        <entry key="android">
          <bean class="com.pets.shiro.filter.MobileTokenAuthentication">
          </bean>
        </entry>
        <entry key="authc">
          <bean class="com.pets.shiro.filter.LoginAuthenticationFilter">
          </bean>
          <!-- <bean class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
          </bean> -->
        </entry>
      </map>
    </property>
  </bean>
/pets/android**=android 指定认证的拦截器,这里是自定义的拦截器
<pre name="code" class="java">/**
 * 移动设备认证基类,提供未登录用户操作认证权限
 *
 * 2014年7月8日
 */
public abstract class AbstractMobileAuthenticationFilter extends
    AuthenticationFilter {
  public static final String TOKEN = "token";
  protected Logger log = Logger.getLogger(getClass());
  @Override
  protected boolean onAccessDenied(ServletRequest request,
      ServletResponse response) throws Exception {
    log.info("安卓用户进入校验!" + getLoginUrl());
    HttpServletRequest req = (HttpServletRequest) request;
    String token = req.getParameter(TOKEN);
    if (isAccess(token)) {
      return onAccessSuccess(req, (HttpServletResponse) response);
    }
    return onAccessFail(req, (HttpServletResponse) response);
  }
  /**
   * 判断token的合法性
   * 
   * @param token
   * @return
   */
  public abstract boolean isAccess(String token);
  /**
   * 认证成功进行的操作处理
   * 
   * @param request
   * @param response
   * @return true 继续后续处理,false 不需要后续处理
   */
  public abstract boolean onAccessSuccess(HttpServletRequest request,
      HttpServletResponse response);
  /**
   * 认证失败时处理结果
   * 
   * @param request
   * @param response
   * @return true 继续后续处理,false 不需要后续处理
   */
  public abstract boolean onAccessFail(HttpServletRequest request,
      HttpServletResponse response);
}
只需要重写
onAccessDenied方法,进行token判断!
来源:https://www.cnblogs.com/shenming/p/4762112.html