我有这些规则来访问我的应用中的网页:
<http auto-config="true" use-expressions="true">
<!-- NON AUTHENTICATION PAGES -->
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/about" access="permitAll" />
<!-- LOGIN FILTER -->
<intercept-url pattern="/login" access="!isAuthenticated()" />
<intercept-url pattern="/j_spring_security_check" access="!isAuthenticated()" />
<intercept-url pattern="/logout" access="!isAuthenticated()" />
<!-- RESOURCES AND OTHER URLs FILTER -->
<intercept-url pattern="/resources/**" access="permitAll" />
<intercept-url pattern="/**" access="isAuthenticated()" />
<!-- FORM LOGIN -->
<form-login login-page="/login" default-target-url="/upload" authentication-failure-url="/loginfailed" />
<logout logout-success-url="/logout" />
</http>
我需要的是在访问失败时重定向到某个URL(例如/ access-denied)并在控制器中处理此事件。
@RequestMapping(value = "/access-denied", method = RequestMethod.GET)
public String accessDenied(Model model, RedirectAttributes ra) {
// do what I want
return "redirect:login";
}
例如用户输入/上传并且他没有登录,因此它将被重定向到/ access-denied。
答案 0 :(得分:2)
这可能有助于解释您为什么需要自己进行重定向,因为Spring Security会自动执行此操作。当访问被拒绝时,未经身份验证的用户的默认行为是将它们重定向到登录页面(这似乎是您想要做的)。
如果要自定义流程,使用的策略是AuthenticationEntryPoint
,实现此策略可能比使用控制器更有意义。我在a previous answer中写了更多关于此的内容。
如果您只想插入一些额外的功能,可以扩展LoginUrlAuthenticationEntryPoint并覆盖commence
方法,调用超类进行重定向。
请注意,这意味着将不使用命名空间元素中的login-page
值。您需要在LoginUrlAuthenticationEntryPoint
。
答案 1 :(得分:0)
请注意后面代码中access-denied-page
中的security-http
属性。
<security:global-method-security
pre-post-annotations="enabled" />
<security:http auto-config="false" use-expressions="true"
disable-url-rewriting="true" entry-point-ref="loginUrlAuthenticationEntryPoint"
access-denied-page="/access-denied">
<security:intercept-url pattern="/someurl"
access="isAuthenticated()" />
</security:http>