zoukankan      html  css  js  c++  java
  • shiro 实现自己定义权限规则校验

    <span style="font-family: Arial, Helvetica, sans-serif;">在系统中使用shiro进行权限管理,当用户訪问没有权限的资源时会跳转到指定的登录url。

    </span>

    可是假设系统中支持手机app。手机訪问时没有使用session进行登录凭证管理。而是使用token,有两种解决方法:

    1:支持手机client訪问的资源在权限配置中配置成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推断!
    
    
    
    





  • 相关阅读:
    多线程
    集合与文件操作
    Net基础复习
    form表单
    html的常用标签和属性
    C#泛型与linq
    2020 年度总结 & OI 生涯感想——当年酒狂自负
    TODO-List
    Attention Points
    THUWC2020 游记
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7237835.html
Copyright © 2011-2022 走看看