spring - 有没有办法在 Spring Security 4.x 上禁用默认的 "/login"?

标签 spring spring-mvc spring-security

当 Spring Security 从 3.2.x 版发展到 4.0.0 版时,使用基于 XML 的配置时需要进行多次修改,如 Migration reference 中所述。 .经过仔细研究后,我仍在努力解决有关新 form-login@login-processing-url 的一些问题。属性。即使我已经指定它继续使用 /j_spring_security_check作为路径,它保留了新的 /login路径事件。

我一直在使用 Spring Security 和 SpringMVC,并开始使用 3.2.7 版进行开发。我有一个 Controller 映射路径 /login到显示登录表单的页面,并根据收到的可能参数显示特定错误消息。下面是我的 Controller

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login(@RequestParam(value = "error", required = false) String error,
                        @RequestParam(value = "logout", required = false) String logout,
                        Model model) {

        if (error != null) {
            model.addAttribute("error", "Usuário e senha inválidos.");
        }

        if (logout != null) {
            model.addAttribute("msg", "Logout bem sucedido.");
        }

        return "login";
    }
}

在 3.2 版本中,我的 spring-security.xml文件指定了 form-login@login-page /login 的参数,因此显示了我的个性化登录表单(相同的路径用于 <logout> )。

现在,即使我已经明确配置了 form-login@login-processing-url , /login仍然重定向到 Spring Security 的默认登录页面。除此之外,即使我还指定了一个 logout@logout-url属性,当登出时,spring 仍然将我重定向到带有“登出成功”消息的默认登录表单,而不是我自己的 Controller 来显示我的个性化登出消息。

当我使用 /login?路径,应用程序显示我自己的登录表单,但如果我调用 /login?logout/login?error ,分别显示我的注销和错误消息,Spring 重定向到默认登录页面。

问题:有没有办法完全禁用 /login重定向?

我知道我可以简单地将我的个性化路径更改为其他内容,例如 /signin并避免混淆,但我这样做是为了了解有关 Spring Security 4.x 的更多信息。此外,我担心用户输入 URL 而不是通过链接导航会简单地放在 spring 的默认登录页面上。

此外,以下是我的 spring-security.xml 的摘录文件,已适应版本 4.x。
<http auto-config="true" use-expressions="true" disable-url-rewriting="true">
    <access-denied-handler error-page="/403" />
    <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/power/**" access="hasRole('ROLE_POWER_USER')" />
    <form-login 
        login-page="/login"  <!-- my controller -->
        default-target-url="/" 
        login-processing-url="/j_spring_security_check" <!-- to reproduce 3.2 behaviour -->
        authentication-failure-url="/login?error" 
        username-parameter="username"
        password-parameter="password" />
    <logout logout-success-url="/login?logout" 
            logout-url="/j_spring_security_logout"/>
    <headers disabled="true"/>
    <csrf disabled="false"/> <!-- I know it could be ommited -->
</http>

更新 (04/16/2015): 看起来像是 4.0.0 版本的错误。检查我的答案。

最佳答案

您需要做的是实现自定义 AuthenticationEntryPoint 以关闭登录重定向(设置为默认值)。

以下是一些入门阅读信息:

http://docs.spring.io/spring-security/site/docs/4.0.0.RELEASE/reference/htmlsingle/#auth-entry-point

这里还有一个例子来说明它是如何实现的:

http://krams915.blogspot.com.au/2010/12/spring-security-mvc-integration-using_26.html

关于spring - 有没有办法在 Spring Security 4.x 上禁用默认的 "/login"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29661518/

相关文章:

java - 使用ajax请求发布大型JSON对象

java - Spring-Boot:在 Java 代码配置(不是 XML)中指定 REALM(安全约束和角色)和 CLIENT-CERT 身份验证?

spring-boot - Spring Boot、带有 azure 的 OAuth2 和另一个提供商(例如 google)

java - 收件人列表路由器 Spring 集成

spring - docker 化的 postgres 和 docker 化的 Spring boot 应用程序

java - S4 启动 PE 时数组索引越界

java - Spring-MVC:调用 validator ,而不是从 Controller 内部

java - 从 IntelliJ 执行文件 IO 时,Spring Boot 会自动重新启动

java - 创建名为 'org.springframework.scheduling.annotation.proxyasyncconfiguration' 的 bean 时出错

java - 以异步方式实现长轮询