shiro android

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判断!

posted @ 2015-08-27 00:39  shenming  阅读(1549)  评论(0编辑  收藏  举报