zoukankan      html  css  js  c++  java
  • 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判断!

  • 相关阅读:
    Codeforces 960B(优先队列)
    “景驰科技杯”2018年华南理工大学程序设计竞赛 H-对称与反对称(逆元)
    AcWing
    POJ
    POJ
    AtCoder
    HRBUST
    CodeForces
    HYSBZ
    HDU
  • 原文地址:https://www.cnblogs.com/shenming/p/4762112.html
Copyright © 2011-2022 走看看