Spring安全性重定向到经过身份验证的URL的登录页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring安全性重定向到经过身份验证的URL的登录页面相关的知识,希望对你有一定的参考价值。

我是新来的春天。我正在创建一个spring mvc app。我有一个管理员网址“/admin/"。如果我使用ROLE_ADMIN登录用户凭据,那么我可以访问管理页面。现在这种情况正常。但是如果我没有使用ROLE_ADMIN登录并且我尝试访问/ admin / url spring security将我重定向到/ login页面。

这里我想要不向外界揭示/ admin /(或admin url存在)url需要身份验证。如果有人未经授权尝试访问/ admin / url,我想显示默认的异常页面或主页。

此外,我需要自定义“/ login”网址,如“/ custom_url /”而不是“/ login”

但是现在我不知道如何实现这一目标。任何帮助表示赞赏。

applicationContext.xml中

</bean>  
<security:http auto-config="true">
    <security:intercept-url pattern="/admin/**" 
access="hasRole('ROLE_ADMIN')" />

     <security:form-login
        login-page="/login"
        default-target-url="/admin"
        always-use-default-target="true"
        login-processing-url="/j_spring_security_check"
        authentication-failure-url="/login?error"
        username-parameter="username"
        password-parameter="password" />
   <security:logout logout-success-url="/" invalidate-session="true" logout-
url="/logout" />
</security:http>

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service data-source-ref="dataSource"
                                    authorities-by-username-query="SELECT 
username, authority From authorities WHERE username = ?"
                                    users-by-username-query="SELECT 
username, password, enabled FROM users WHERE username = ?" />
    </security:authentication-provider>
</security:authentication-manager>

登录控制器

@RequestMapping("/login")
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", "Invalid username and password");
    }

    if(logout!=null) {
        model.addAttribute("msg", "You have been logged out successfully.");
    }

    return "login";
}

login.jsp的

   <c:if test="${not empty msg}">
            <div class="msg">${msg}</div>
        </c:if>

   <form name="loginForm" action="<c:url 
value="/j_spring_security_check" />" method="post">
            <c:if test="${not empty error}">
                <div class="error" style="color: #ff0000;">${error}</div>
            </c:if>
            <div class="form-group">
                <label for="username">User: </label>
                <input type="text" id="username" name="username" 
class="form-control" />
            </div>
            <div class="form-group">
                <label for="password">Password:</label>
                <input type="password" id="password" name="password" 
class="form-control" />
            </div>

            <input type="submit" value="Submit" class="btn btn-default">

            <input type="hidden" name="${_csrf.parameterName}" 
value="${_csrf.token}" />
        </form>

我正在使用Spring security 4。

答案

authentication-failure-url="/login?error"更改为authentication-failure-url="/"。这会将您重定向到主页。

applicationContext.xml中正确的xml-snippet如下:

 <security:form-login
    login-page="/login"
    default-target-url="/admin"
    always-use-default-target="true"
    login-processing-url="/j_spring_security_check"
    authentication-failure-url="/"
    username-parameter="username"
    password-parameter="password" />

注意:您可以根据需要将authentication-failure-url属性的值更改为异常页面。

以上是关于Spring安全性重定向到经过身份验证的URL的登录页面的主要内容,如果未能解决你的问题,请参考以下文章

Spring 安全性未重定向到给定的 OAuth 身份验证 URL

Django 身份验证 - 错误的重定向 url 到登录页面

如何为每个 url 配置 grails/spring 身份验证方案?

如何将动态重定向 URL 传递到 Azure 应用注册身份验证过程(.NET 框架)?

会话超时后,Spring 安全性不会重定向到上次请求的页面登录

Spring安全重定向到登录并恢复之前输入的表单数据