所以我在spring config xml文件中有这个。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/welcome/*" access="hasRole('ADMIN')" />
<!-- <intercept-url pattern="/login" requires-channel="https" /> -->
<!-- access denied page -->
<access-denied-handler error-page="/403" />
<form-login login-page="/login"
default-target-url="/welcome"
authentication-failure-url="/login?error"
username-parameter="emailId"
password-parameter="pwd" />
<logout logout-success-url="/login?logout"/>
</http>
在登录时正确验证角色。我有两个问题:
pattern="/welcome/*"
,pattern="/welcome*"
和pattern="/welcome/**"
之间的区别是什么?当pattern="/welcome/*"
时,登录成功并且用户看到该页面。在其他两个选项中,将显示403 Access Denied页面。用户具有“ADMIN”权限)Spring安全流程如何注销?我在welcome.jsp文件中有以下代码:
<c:url value="/logout" var="logoutUrl" />
<form action="${logoutUrl}" method="GET" id="logoutForm">
<input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" />
</form>
<script>
function formSubmit() {
document.getElementById("logoutForm").submit();
}
</script>
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>
User : ${pageContext.request.userPrincipal.name} | <a
href="javascript:formSubmit()"> Logout</a>
</h2>
</c:if>
这在我的控制器中:
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return "redirect:/login?logout";
}
页面重定向正确并显示“注销成功”页面,但如果我更改URL以再次转到“/ welcome”,则会显示该页面。它不应该显示 403 - 拒绝访问页面?
答案 0 :(得分:1)
使用Ant风格语法的主要作用是解析确切路径的有效性。
映射使用以下规则匹配URL:
?
匹配一个字符*
匹配零个或多个字符**
匹配路径中的零个或多个目录关于你的案件:
/welcome/*
- 这可能适用于/welcome/hello
或/welcome/#hello
,/welcome/?abc=123
/welcome*
- 有效期为/welcome?abc=123
,/welcome#abc=123
。/welcome/**
- 有效案例为/welcome/hello/bye?abc=123
。有关此问题的更多信息,请访问Spring Documentation。
我假设你使用xml-configuration来提高安全性。无论如何,这可以修改为使用纯Java配置。
在app-security.xml
中应该是这样的:
<http use-expressions="true"
disable-url-rewriting="true">
<http-basic />
<!-- other configurations -->
<intercept-url pattern="/login**" access="isAnonymous()"/>
<intercept-url pattern="/**" access="isAuthenticated()"/>
<!-- other configurations -->
<logout logout-url="/logout"
logout-success-url="/login"/>
</http>
在index.html
档案中的某处:
<a href="<c:url value="/logout" />" id="item-btn-logout">
<i class="icon-off"></i> Logout
</a>
最重要的部分是网址:/logout
。