Spring 安全重定向到登录页面以获取经过身份验证的 url

Posted

技术标签:

【中文标题】Spring 安全重定向到登录页面以获取经过身份验证的 url【英文标题】:Spring security redirecting to login page for authenticated urls 【发布时间】:2018-08-07 23:50:24 【问题描述】:

我是春天的新手。我正在创建一个 spring mvc 应用程序。我有一个管理员网址“/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 安全 4。

【问题讨论】:

【参考方案1】:

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

applicationContext.xml中正确的xml-sn-p如下:

 <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属性的值更改为异常页面。

【讨论】:

感谢您的回答。但是我尝试通过更改 authentication-failure-url 但它对当前场景没有影响,而不是对重定向到主页的无效凭据产生影响。

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

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

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

登录成功后访问登录页面时出现Spring安全访问被拒绝消息。它应该重定向到默认页面

Spring Cloud OAuth2:身份验证后再次重定向到登录页面,就像使用表单登录时未经身份验证一样

Spring Security - 如果已经登录则重定向

Spring Security - 如果已经登录则重定向