我有一个服务器,使用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文件。
答案 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'>
实际上是在调用安全过滤器。无论如何问题解决了。适合初学者:)