0

我有这些规则来访问我的应用程序中的页面:

<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";
}

例如,用户输入 /upload 并且他没有登录,因此它将被重定向到 /access-denied。

4

2 回答 2

2

这可能有助于解释为什么您需要自己进行重定向,因为 Spring Security 会自动执行此操作。当访问被拒绝时,未经身份验证的用户的默认行为是将他们重定向到登录页面(这似乎是您想要做的)。

如果您想自定义流程,使用的策略AuthenticationEntryPoint可能是实现它比使用控制器更有意义。我在之前的回答中已经写了更多关于这个的内容。

如果您只想插入一些额外的功能,您可以扩展LoginUrlAuthenticationEntryPoint并覆盖该commence方法,调用超类来执行重定向。

请注意,这意味着login-page不会使用命名空间元素中的值。您需要在构造函数中为LoginUrlAuthenticationEntryPoint.

于 2012-07-22T16:16:56.473 回答
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>
于 2014-10-06T13:05:45.743 回答