我在应用程序中使用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/**
这意味着该规则将应用于带有前缀的所有URL localhost:8080/privatePages/...
,并且如果在该规则中您强制执行某种必需的身份验证,那么无论您在Controller中做什么,它都会询问您因为您的请求会在到达该阶段之前先经过安全过滤器。
在您的SecurityConfig中,尝试执行以下操作:
<http auto-config="true">
<intercept-url pattern="/privatePages" access="ROLE_RequredRole" />
<intercept-url pattern="/privatePages/somePage.jsp" access="ROLE_ANONYMOUS" />
</http>
在这里,我们利用ROLE_ANONYMOUS
它意味着它不需要任何身份验证。有关更多信息,请参见此处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句