我有一个网站部分(/secure
URL下的所有内容),我试图使用Spring Security 3.2.5保护。我使用以下XML配置:
<http use-expressions="true">
<intercept-url pattern="/secure/login" access="permitAll" />
<intercept-url pattern="/secure/**" access="isAuthenticated()" />
<form-login default-target-url="/secure/home" always-use-default-target="true" login-page="/secure/login" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="user" password="password" authorities="ROLE_SECURE" />
</user-service>
</authentication-provider>
</authentication-manager>
我试图使用我拥有此控制器的自定义登录表单:
@Controller
@RequestMapping(value = "/secure")
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String getLogin() {
return "secure/login";
}
@RequestMapping(value = "/home", method = RequestMethod.GET)
public String getHome() {
return "secure/home";
}
}
并在登录页面内输入此代码:
<form method="POST" action="<c:url value="/secure/login" />">
username: <input type="text" name="username" /><br/>
password: <input type="password" name="password" /><br/>
<input type="submit" value="Login" />
</form>
我使用web.xml
和ContextLoaderListener
在springSecurityFilterChain
中加载了安全上下文
/secure
委托代理过滤器也已设置。
当我尝试访问/secure/login
网址时,我被重定向到getLogin
,我的控制器在LoginController
方法中被调用,我看到了我的登录页面。一切都好。
现在我的问题:我在登录表单中提交的任何内容都会直接发送到@RequestMapping(value = "/login", method = RequestMethod.POST)
public String postLogin() {
return "redirect:/secure/home";
}
,我得到一个例外,说POST不受支持
方法,这是有道理的,因为控制器中没有POST处理程序。
如果我在控制器中添加这样的方法:
postLogin
我不再收到错误,但调用了我的/secure/home
方法,我发送给/secure/login
未经身份验证,然后将我重定向到/secure
,然后我回到原点。
我不知道自己做错了什么。我在网上看到的所有示例都是Java配置,我不想使用它,并且所有工作流都在应用程序的上下文中,而不是在一些额外的URL路径下(在我的情况下为{{1}})。
我错过了什么?
答案 0 :(得分:1)
形成文档(http://docs.spring.io/spring-security/site/docs/3.0.x/reference/appendix-namespace.html):
默认目标-网址:
映射到UsernamePasswordAuthenticationFilter的defaultTargetUrl属性。如果未设置,则默认值为&#34; /&#34; (应用程序根目录)。登录后,用户将被带到此URL,前提是他们在尝试访问受保护资源时未被要求登录,而这些用户将被带到最初请求的URL。
您必须将表单提交至j_spring_security_check
<form name='loginForm'
action="<c:url value='j_spring_security_check' />" method='POST'>
这将由Spring Security处理,并将根据您的配置检查用户并传递。 请参阅此示例http://www.mkyong.com/spring-security/spring-security-form-login-example/
修改:还应支持j_security_check
。
答案 1 :(得分:0)
这篇文章帮助我得到了正确的结果:http://codehustler.org/blog/spring-security-tutorial-form-login/