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安全访问被拒绝消息。它应该重定向到默认页面