【发布时间】:2016-09-15 16:57:54
【问题描述】:
我在我的应用程序中使用 Spring Security。当用户想要访问 /privatePages/* 时,会显示登录屏幕以进行身份验证。这工作正常。我想有一些东西作为访客访问所以在我的控制器中我做了这样的事情:
Authentication authentication = new UsernamePasswordAuthenticationToken("SAMPLE", "SAMPLE", getAuthority());
//authentication.setAuthenticated(true);
SecurityContextHolder.getContext().setAuthentication(authentication);
public Collection<GrantedAuthority> getAuthority() {
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
GrantedAuthority grantedAuthority = new GrantedAuthority() {
public String getAuthority() {
return "ROLE_RequiredRole";
}
};
grantedAuthorities.add(grantedAuthority);
return grantedAuthorities;
}
我可以看到现在执行了身份验证,因为这个表达式给出了 true:
SecurityContextHolder.getContext().getAuthentication().isAuthenticated()
但是我无法访问/privatePages/somePage.jsp。它仍然将我重定向到登录页面。我错过了什么吗?
更新
<http pattern="/privatePages/**" auto-config="true" use-expressions="true" authentication-manager-ref="myManager" create-session="never">
<session-management invalid-session-url="/privatePages/login" />
<intercept-url pattern="/privatePages" access="hasRole('RequiredRole')"/>
<intercept-url pattern="/privatePages/" access="hasRole('RequiredRole')"/>
<form-login
login-page="/privatePages/login" . . . .
【问题讨论】:
-
好吧,如果您在安全配置中拥有
/privatePages/*的权限,例如:http.authorizeRequests().antMatchers("/privatePages/*").hasAnyRole("whatever);,那么它将对前缀为/privatePages/...的所有URL 强制执行该规则。相反,在设置需要身份验证的规则之后,您应该使/privatePages/somePage.jsp具有anonymous()范围。 -
我希望它无需凭据即可登录。
标签: java spring-mvc spring-security