shiro自定义拦截url

Posted 凝荷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro自定义拦截url相关的知识,希望对你有一定的参考价值。

  在实际项目上,我们针对不同的用户(guste,user,admin,mobile user)等等,需要进入不同的页面,比如,手机端用户需要进入Mobile/这个路径下的,这个时候,我们需要自定义拦截url,就比如下面的url:

电脑端用户登录页面 http://localhost:8080/login

手机端用户登录页面 http://localhost:8080/mobile/login

而在我们通用的配置中是这样配置的:

<!--Shiro配置 -->
<!-- Shiro 的Web过滤器 web.xml中shiro的filter对应的bean -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login" />
    <!-- 登陆成功后要跳转的连接 -->
    <!--<property name="successUrl" value="/success" />-->
    <!-- 没有权限要跳转的链接 -->
    <!--<property name="unauthorizedUrl" value="/regester" />-->

    <!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->
    <property name="filterChainDefinitions">
        <value>
            <!-- 对静态资源设置匿名访问 -->
            /resources/** = anon
            /login = anon
            /** = authc
        </value>
    </property>
</bean>

这样的配置很明显,不符合我们的要求,那么怎么办呢?下面先看最终的配置的xml,然后一个一个解析:

<!--手机权限认证bean-->
<bean id="mobileFormAuthenticationFilter" class="com.unisits.zngkpt.framework.privilegeframe.bojo.CustomAccessControlFilter">
    <!-- 手机登录的url -->
    <property name="mobileLoginUrl" value="/mobile/login" />
</bean>
<!--Shiro配置 -->
<!-- Shiro 的Web过滤器 web.xml中shiro的filter对应的bean -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
    <property name="loginUrl" value="/login" />
    <!-- 登陆成功后要跳转的连接 -->
    <!--<property name="successUrl" value="/success" />-->
    <!-- 没有权限要跳转的链接 -->
    <!--<property name="unauthorizedUrl" value="/regester" />-->

    <!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->
    <property name="filterChainDefinitions">
        <value>
            <!-- 对静态资源设置匿名访问 -->
            /resources/** = anon
            <!--手机登录路径-->
            /mobile/checkname = anon
            /mobile/login = anon
            /mobile/** = mobileAuthc
            /login = anon
            /** = authc
        </value>
    </property>
    <!-- 自定义filter配置 -->
    <property name="filters">
        <map>
            <!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 -->
            <entry key="mobileAuthc" value-ref="mobileFormAuthenticationFilter" />
        </map>
    </property>
</bean>

这里,我们自定义了一个过滤规则:mobileAuthc,然后这个过滤规则对应一个过滤器:mobileFormAuthenticationFilter。

下面是自定义拦截器:

package com.unisits.zngkpt.framework.privilegeframe.bojo;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * @author:lyy
 * @Date: 2014/9/20 13:30
 * @version:
 * @Description: 自定义url过滤器
 */
public class CustomAccessControlFilter extends AccessControlFilter {

    private String mobileLoginUrl;

    public String getMobileLoginUrl() {
        return getLoginUrl();
    }

    public void setMobileLoginUrl(String mobileLoginUrl) {
        this.mobileLoginUrl = mobileLoginUrl;
    }

    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        Subject subject = getSubject(request, response);
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            WebUtils.issueRedirect(request, response, mobileLoginUrl);
            return false;
        }
        return true;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        Subject subject = getSubject(request, response);
        if (!subject.isAuthenticated() && !subject.isRemembered()) {
            return false;
        }
        return true;
    }
}

其实,这个只是针对移动端新增了一个规则,但是普遍性还是不够,如果多个url都用一个过滤规则呢?其实也是可以的,可以自定义一个类,这个类有一个map对的属性,里面是规则,还有一个默认规则。然后根据url的匹配,来设定不同的规则对应不同的url

附录:

shiro的过滤器

Filter Name

Class

anon

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

logout

org.apache.shiro.web.filter.authc.LogoutFilter

noSessionCreation

org.apache.shiro.web.filter.session.NoSessionCreationFilter

perms

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

org.apache.shiro.web.filter.authz.PortFilter

rest

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

org.apache.shiro.web.filter.authz.SslFilter

user

org.apache.shiro.web.filter.authc.UserFilter

以上是关于shiro自定义拦截url的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段3——url大全

VSCode自定义代码片段3——url大全

⭐图例结合超硬核讲解shiro⭐

shiro原理之过滤器

Shiro入门这篇就够了Shiro的基础知识回顾URL拦截

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段