有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpring安全性:登录身份验证控制器

当身份验证失败时,我试图重定向回登录页面,并显示一些错误消息。我想知道我们如何在security-context.xml中向/login传递一些参数,说这是未经身份验证的,然后附加一些错误文本

<security:form-login login-page="/login"
                     username-parameter="email"
                     password-parameter="password"
                     default-target-url="/member/"
                     authentication-failure-url="/login"/>

/login实际上是一个用于返回ModelAndView的控制器


共 (3) 个答案

  1. # 1 楼答案

    尝试简单地将查询参数附加到authentication-failure-url中,如下所示:

    <security:form-login login-page="/login"
                         username-parameter="email"
                         password-parameter="password"
                         default-target-url="/member/"
                         authentication-failure-url="/login?error=true" />
    

    然后,您的登录处理程序方法可以接收该可选查询参数,并相应地操作响应。大致如下:

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String getLoginPage(
            @RequestParam(required = false) boolean error,
            ModelMap model) {
    
        model.put("error", error ? "You have entered an invalid username or password!" : "");
    
        return "loginpage";
    }
    
  2. # 2 楼答案

    我通常这样做

    <security:form-login login-page="/" authentication-failure-url="/myapp/auth/login?error=true" default-target-url="/myapp/main/default"/>
    

    以及控制器:

    @RequestMapping(value = "/auth/login", method = RequestMethod.GET)
    public ModelAndView indexp(@RequestParam(value = "error", required = false) boolean error, ModelMap model, Principal principal) {
    ModelAndView mv = new ModelAndView("view");
    // return your view....
    }
    

    该参数有助于显示错误消息

  3. # 3 楼答案

    您还可以使用AuthenticationFailureHandler,它将根据您将收到的AuthenticationException做出不同的反应

    <security:form-login login-page="/login"
        username-parameter="email"
        password-parameter="password"
        default-target-url="/member/" 
        authentication-failure-handler-ref="myAuthenticationFailudeHandler"/>
    

    例如,它可以将用户重定向到/登录?errorCode=errorCode1

    然后,您可以修改控制器以对不同的错误代码作出反应:

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String getLoginPage(
            ..., 
            @RequestParam(value="errorCode", required = false) String errorCode, 
            Model model, 
            ... ) {
        if (errorCode != null) {
            model.put("error", translateErrorCode(errorCode));
        }
        ...