我的CustomUsernamePasswordAuthenticationFilter未应用

时间:2015-06-11 06:38:01

标签: spring spring-mvc spring-security

我有一个服务器,使用spring安全过滤器对用户进行身份验证。客户端以json格式发送其登录凭据以确保其有效性。所以我创建了我的自定义UsernamePasswordAuthenticationFilter过滤器并在http标签内声明它。

登录页面已经是客户端应用程序。客户端需要做的就是在请求数据包中创建带有用户给定凭据的http post请求,并将其发送到服务器以确保其有效性。服务器将回复“有效”/“无效”。

弹簧security.xml文件:

<http use-expressions="true" auto-config="false"
    entry-point-ref="loginUrlAuthenticationEntryPoint">

    <custom-filter ref="CustomUsernamePasswordAuthenticationFilter"
        position="FORM_LOGIN_FILTER " />
    <access-denied-handler error-page="/resources/accessDenied" />
    <intercept-url pattern="/resources/entryPoint" access="permitAll" />
    <intercept-url pattern="/resources/**" access="hasRole('ROLE_ADMIN')"/>
    <intercept-url pattern="/**" access="permitAll" />
</http>

<beans:bean id="CustomUsernamePasswordAuthenticationFilter"
    class="com.controller.CustomUsernamePasswordAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager" />
    <beans:property name="authenticationSuccessHandler"
        ref="successHandler" />
    <beans:property name="authenticationFailureHandler"
        ref="failureHandler" />
    <beans:property name="filterProcessesUrl" value="/j_spring_security_check" />
    <beans:property name="usernameParameter" value="j_username" />
    <beans:property name="passwordParameter" value="j_password" />
</beans:bean>

<authentication-manager alias="authenticationManager">
    <authentication-provider>
        <user-service>
            <user name="pra" password="321" authorities="ROLE_ADMIN,ROLE_USER" />
            <user name="user" password="password" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

<beans:bean id="successHandler"
    class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <beans:property name="defaultTargetUrl" value="/resources/login" />
</beans:bean>


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

<beans:bean id="loginUrlAuthenticationEntryPoint"
    class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <beans:property name="loginFormUrl" value="/resources/entryPoint" />
</beans:bean>

mvc控制器:

@Controller

public class HookUpController {

@RequestMapping( value = "/", method = RequestMethod.POST )
@ResponseStatus(HttpStatus.OK)
@ResponseBody
private String homePage(){

    return "Home Page";
}

@RequestMapping( value = "/resources/entryPoint", method = RequestMethod.GET )
@ResponseStatus(HttpStatus.OK)
@ResponseBody
private String entryPoint(){

    return "EntryPoint";
}

@RequestMapping( value = "/resources/accessDenied", method = RequestMethod.POST )
@ResponseBody
private String accessDenied(){      
    return "invalid";
}

@RequestMapping(value = "/resources/login", method = RequestMethod.POST)
@ResponseBody
private String login() {
    return "valid";
}

}

问题:

我的客户希望直接使用包含登录凭据的帖子请求调用url/resources/login。但控制总是进入entry-point-ref="loginUrlAuthenticationEntryPoint"并返回“EntryPoint”字符串,就像我在控制器中给出的那样。我想直接应用自定义过滤器而不调用“entry-point-ref”。

我认为这是最好的我可以解释我的问题。如果对问题陈述有任何疑问请咨询。请回复解决方案。我这里没有包含CustomUsernamePasswordAuthenticationFilter.java文件。

2 个答案:

答案 0 :(得分:0)

loginUrlAuthenticationEntryPoint将用户发送到/ resources / entrypoint(如bean定义中所示)。

/ resources / entrypoint被映射为允许所有

<intercept-url pattern="/resources/entryPoint" access="permitAll" />

这就是请求进入入口点url - / resources / entrypoint的原因,而你的控制器又是mapepd返回字符串&#34; EntryPoint&#34;

这是一个很好的春季安全教程 - http://javakart.blogspot.ae/2012/12/spring-security-tutorial-form-login-example.html

答案 1 :(得分:0)

这是一个愚蠢的错误。问题在于我发布的用于验证资源的网址url/resources/login。它应该是url/j_spring_security_check。由于在UsernamePasswordAuthenticationFilter中设置的filterProcessUrl是<beans:property name="filterProcessesUrl" value="/j_spring_security_check" />。 除此URL之外的任何内容都将反映到entry-point-ref标记。

我的客户端是Android应用程序,使用HttpUrlConnection发布请求。 HttpUrlConnection正在使用我的数据创建发布请求,并且我没有指定表单提交操作。阅读了几篇帖子和Paul John分享的帖子之后,这一行: - <form name='loginForm' action="j_spring_security_check" method='POST'>实际上是在调用安全过滤器。无论如何问题解决了。适合初学者:)