Spring security4.1.4 如何实现api接口和页面的双重拦截

dileber先暂缓一下,最近在作服务器认证方面的东西

貌似市面上关于双重拦截的比较少,而且版本都比较旧 ,我今天就给大家讲讲spring secutiry的双重拦截,下回我再讲讲shiro的双重拦截。最近做东西比较杂乱~~哈哈

首先讲一下spring Security入和对接口和页面同时拦截

首先是配置文件

<beans:beans xmlns="http://www.springframework.org/schema/security"
             xmlns:beans="http://www.springframework.org/schema/beans" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/security
   http://www.springframework.org/schema/security/spring-security-3.2.xsd">

    <!-- enable use-expressions -->
    <http auto-config="true" use-expressions="true" entry-point-ref="MyAuthenticationEntryPoint">

不拦截的接口
        <intercept-url pattern="/customer" access="permitAll"></intercept-url>

       

拦截的api
        <intercept-url pattern="api/cv1/**" access="hasRole('ROLE_USER')" />
       
拦截的网页
        <intercept-url pattern="/customer/**" access="hasRole('ROLE_USER')" />
       
页面登录
        <custom-filter ref="loginFilter" after="FORM_LOGIN_FILTER"/>
ajax登录
        <custom-filter ref="ajaxLoginFilter" before="FORM_LOGIN_FILTER"/>
开启csrf,之前的博客我也有说个csrf 你们自己看看就好
        <!-- enable csrf protection -->
        <!--<csrf/>-->
    </http>

    <beans:bean id="MyAuthenticationEntryPoint" class="com.cs.jucaibang.back_end.utils.springsecurity.MyAuthenticationEntryPoint">
        <beans:property name="loginFormUrl" value="/customer/login" />
    </beans:bean>

    <!-- 验证ajax请求,配置 开始-->
    <beans:bean id="ajaxLoginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
        <beans:property name="authenticationFailureHandler" ref="ajaxFailureHandler"/>
        <beans:property name="authenticationSuccessHandler" ref="ajaxSuccessHandler"/>
        <beans:property name="filterProcessesUrl" value="/api/login"/>
        <beans:property name="passwordParameter" value="passWord"/>
        <beans:property name="usernameParameter" value="userName"/>
    </beans:bean>

    <beans:bean id="ajaxFailureHandler" class="com.utils.springsecurity.AjaxAuthenticationFailureHandler">
    </beans:bean>

    <beans:bean id="ajaxSuccessHandler" class="com.utils.springsecurity.AjaxAuthenticationSuccessHandler">
    </beans:bean>
    <!-- 验证ajax请求,配置 结束-->


    <!--普通请求,配置开始 -->
    <beans:bean id="loginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
        <beans:property name="authenticationFailureHandler" ref="failureHandler"/>
        <beans:property name="authenticationSuccessHandler" ref="successHandler"/>
        <beans:property name="filterProcessesUrl" value="/customer/login"/>
        <beans:property name="passwordParameter" value="passWord"/>
        <beans:property name="usernameParameter" value="userName"/>
    </beans:bean>

    <beans:bean id="failureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
        <beans:property name="defaultFailureUrl" value="/err/403" />
    </beans:bean>

    <beans:bean id="successHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
        <beans:property name="alwaysUseDefaultTargetUrl" value="false"/>
        <beans:property name="defaultTargetUrl" value="/"/>
    </beans:bean>
    <!--普通请求,配置结束 -->


  

    <!-- Select users and user_roles from database -->
    <authentication-manager  alias="authenticationManager">
        <authentication-provider ref='commonAuthenticationProvider'/>
        <!--        <authentication-provider>
            <jdbc-user-service 
                data-source-ref="dataSource"
                users-by-username-query=
                "select username,password, enabled from users where username=?"
                authorities-by-username-query=
                "select username, role from user_roles where username =?  " />
        </authentication-provider>-->
    </authentication-manager>
   
    
    <global-method-security secured-annotations="enabled" />
</beans:beans>




实现

AuthenticationFailureHandler

/**
 * Created by yy on 2016/1/12.
 */
public class AjaxAuthenticationFailureHandler implements AuthenticationFailureHandler {

    public AjaxAuthenticationFailureHandler() {
    }

    @Override
    public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
        httpServletResponse.setContentType("application/json");
        httpServletResponse.setCharacterEncoding("UTF-8");
        PrintWriter out = httpServletResponse.getWriter();
        DataWrapper dataWrapper = new DataWrapper();
        dataWrapper.setStatus(-1);
        dataWrapper.setMsg("登录失败");
        out.println(StringHelper.JsonHelper.toJson(dataWrapper));
        out.flush();
        out.close();
    }
}

同上


/**
 * Created by yy on 2016/1/12.
 */
public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    public AjaxAuthenticationSuccessHandler() {
    }

    @Autowired
    UserService service;

    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
        httpServletResponse.setContentType("application/json");
        httpServletResponse.setCharacterEncoding("UTF-8");
        PrintWriter out = httpServletResponse.getWriter();
        ModelUserAuth user = (ModelUserAuth) authentication.getPrincipal();
        WrapperJcbLogin result=service.spring_login(user.getUserName(), httpServletRequest);
        out.println(StringHelper.JsonHelper.toJson(result));
        out.flush();
        out.close();
    }
}


同上



/**
 * Created by yy on 2016/1/12.
 */
public class MyAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {

    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
    static Pattern apiPattern= Pattern.compile("^/[a-z]v[0-1]/(w|r)/");

    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
            throws IOException, ServletException {

        String redirectUrl = null;

        String url = request.getRequestURI();


        Matcher m=apiPattern.matcher(url);
        if( m.find()){
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            DataWrapper dataWrapper = new DataWrapper();
            dataWrapper.setStatus(-1);
            dataWrapper.setMsg("您还未登录");
            out.println(StringHelper.JsonHelper.toJson(dataWrapper));
            out.flush();
            out.close();
        }else{
            if (this.isUseForward()) {

                if (this.isForceHttps() && "http".equals(request.getScheme())) {
                    // First redirect the current request to HTTPS.
                    // When that request is received, the forward to the login page will be used.
                    redirectUrl = buildHttpsRedirectUrlForRequest(request);
                }

                if (redirectUrl == null) {
                    String loginForm = determineUrlToUseForThisRequest(request, response, authException);

                    RequestDispatcher dispatcher = request.getRequestDispatcher(loginForm);

                    dispatcher.forward(request, response);

                    return;
                }
            } else {
                // redirect to login page. Use https if forceHttps true

                redirectUrl = buildRedirectUrlToLoginPage(request, response, authException);

            }

            redirectStrategy.sendRedirect(request, response, redirectUrl);
        }

    }


}



/**
 * Created by yy on 2016/1/11.
 * 对spring security 拦截的重写
 *
 */
public class MySpringAccessDeniedHandler implements AccessDeniedHandler {


    @Override
    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        boolean isAjax = "XMLHttpRequest".equals(httpServletRequest.getHeader("X-Requested-With"));
        //如果是ajax请求
        if (isAjax) {
            httpServletResponse.setContentType("application/json");
            httpServletResponse.setCharacterEncoding("UTF-8");
            PrintWriter out = httpServletResponse.getWriter();
            DataWrapper dataWrapper = new DataWrapper();
            dataWrapper.setStatus(-1);
            dataWrapper.setMsg("403");
            out.println(StringHelper.JsonHelper.toJson(dataWrapper));
            out.flush();
            out.close();
            return;
        }
        else if (!httpServletResponse.isCommitted()) {
            if (clientErrorPage != null) {
                // Put exception into request scope (perhaps of use to a view)
                httpServletRequest.setAttribute(WebAttributes.ACCESS_DENIED_403, accessDeniedException);

                // Set the 403 status code.
                httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);

                // forward to error page.
                RequestDispatcher dispatcher = httpServletRequest.getRequestDispatcher(clientErrorPage);
                dispatcher.forward(httpServletRequest, httpServletResponse);
            } else {
                httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN, accessDeniedException.getMessage());
            }
        }

    }

    private String clientErrorPage;

    public void setClientErrorPage(String clientErrorPage) {

        if((clientErrorPage != null)&&!clientErrorPage.startsWith("/")){
            throw new IllegalArgumentException("errorPage must begin with '/'");
        }
        this.clientErrorPage = clientErrorPage;
    }


}
 
如上几步就可以成功配置双重拦截了   



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二蛋和他的大花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值