使用 Spring Security 运行应用程序时,我在所有浏览器上都出现以下错误:
“服务器理解请求但拒绝授权”
我尝试在“spring-security.xml”文件中将角色从“ROLE_ADMIN”更改为“ROLE_USER”。
下面是“spring-security.xml”
<http auto-config="true">
<intercept-url pattern ="/admin" access = "hasRole('ROLE-USER')"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name = "abc" password = "xyz" authorities="hasRole('ROLE-USER')" />
</user-service>
</authentication-provider>
</authentication-manager>
下面是SpringController类:
@Controller
public class SpringController {
@RequestMapping(value = "/")
public String homePage() {
return "HomePage";
}
@RequestMapping(value="/admin", method=RequestMethod.GET)
public String loginPage() {
return "login";
}
HomePage.jsp 和 login.jsp 页面已加载属性,但在 login.jsp 上传递凭据后出现错误:
HTTP 状态 403 – 禁止
类型:状态报告
消息:访问被拒绝
描述:服务器理解请求但拒绝 授权它。
Apache Tomcat/7.0.90
403 是一个非常通用的错误代码。我遇到了同样的问题,但在进行了一些更改后,我能够使其正常工作。仍然不确定问题是密码加密还是 form-login 标签的配置。
<security:http auto-config="true" >
<security:intercept-url pattern="/login*" access="isAnonymous()" />
<security:intercept-url pattern="/**" access="isAuthenticated()"/>
<security:form-login login-page="/login" login-processing-url="/login-user" authentication-failure-url="/login?error=true" />
<security:csrf disabled="true" />
<security:logout logout-success-url="/" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="admin" password="{noop}admin" authorities="ROLE_USER" />
</security:user-service>
</security:authentication-provider >
</security:authentication-manager>
忽略标签中的security:前缀。
密码前面的{noop}确保我没有对密码使用任何加密。
显示登录 JSP 的控制器
@Controller
@RequestMapping("/login")
public class LoginController {
@RequestMapping(value = { "/", "" }, method = { RequestMethod.GET})
public String login(HttpServletRequest request) {
System.out.println("LoginController.login() "+request.getRequestURI());
return "login";
}
}
形式动作
<form name='loginForm' action="login-user" method='POST'>
我遇到了这个问题,但在使用 spring 时没有。我们在同一台服务器上托管我们自己的内部应用程序的两个实例,但使用两个不同的端口。登录到一个实例是可以的,但是从同一个浏览器(另一个选项卡)登录到另一个实例会导致从 tomcat 抛出上述错误,并显示此消息“CSRF nonce 验证失败”。
我所做的解决方法是从不同的浏览器登录到另一个实例。我知道这不是解决方法,但如果您遇到与我类似的情况,它可能会有所帮助
发生这种情况是因为您使用具有 spring 安全性的普通
这也发生在我身上,因为我不小心在不同的 tomcat 服务器上启动了我的应用程序的两个实例。我通过删除我的
webapps
和work
文件夹中的应用程序的工作目录并重新启动服务器来解决它。
在处理 spring security 时使用
<form:form>
标签,而不是如下所示为每个表单手动添加 CSRF 令牌
<form:form action="", method="">
</form:form>
在我的例子中,这是因为
authorities
标签下的 user-service
设置。删除 hasRole 对我有用。
<http auto-config="true">
<intercept-url pattern ="/admin" access = "hasRole('ROLE-USER')"/>
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name = "abc" password = "xyz" authorities="ROLE-USER" />
</user-service>
</authentication-provider>
</authentication-manager>
最好在隐身窗口中打开 Web 应用程序。