我复制了一个正在使用的页面示例。如果当前用户是管理员,他可以查看和使用完整的菜单,但如果用户是普通用户,他可以看到菜单的剪切版本。问题是,普通用户可以打开url,只有管理员才能使用。
示例:localhost:8080/{hostpath}/users-只有管理员用户必须打开此url,但现在管理员和普通用户可以打开我。
如何使一些url限制为普通用户?
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="<c:url value="/resources/css/dom.css" />" rel="stylesheet">
<script src="<c:url value="/resources/js/dom.js" />"></script>
<spring:message code="configure.app.path" var="hostpath" />
</head>
<body>
<article class="mainWrapper">
<div>
<c:choose>
<c:when test="${sessionScope.user.admin}">
<c:choose>
<c:when test="${active == true}">
<h1>ADMIN</h1>
<nav class="topNav">
<ul>
<li class="selected"><a href="${hostpath}/home">Home</a></li>
<li><a href="${hostpath}/settings">Settings</a></li>
<li><a href="${hostpath}/users">Users</a></li>
<li><a href="${hostpath}/groups">Groups</a></li>
<li><a href="${hostpath}/pdata">PrivateData</a></li>
<li><a href="${hostpath}/secur">Security</a></li>
</ul>
</nav>
</c:when>
<c:otherwise>
<h1>ACTIVATE REGISRATION</h1>
<p>some explanation text</p>
</c:otherwise>
</c:choose>
<br class="clear" />
<br />
</c:when>
<c:otherwise>
<h1>USER</h1>
<nav class="topNav">
<ul>
<li class="selected"><a href="${hostpath}/home">Home</a></li>
<li><a href="${hostpath}/pdata">PrivateData</a></li>
<li><a href="${hostpath}/secur">Security</a></li>
</ul>
</nav>
</c:otherwise>
</c:choose>
</div>
</article>
</body>
</html>
解决问题有很多方法。我要做的方法是获取当前loggedin用户。假设您已经遵循了spring安全约定,一旦您有了当前用户,您就可以根据您在应用程序中的定义来获取该用户的角色,然后将该用户注入模型中,现在可以在jsp页面中比较用户角色。
该方法获取用户的当前日志:
public static User getCurrentUser() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String email = ((UserDetails) principal).getUsername();
loginUser = userService.findUserByEmail(email);
return new SecurityUser(loginUser);
}
return null;
}
然后你在你的模型中注入当前用户:
@RequestMapping(value = "/users", method = RequestMethod.GET)
public String getUserPage(Model model) {
User user = getCurrentUser();
model.addAttribute("user", user);
return "users";
}
现在您可以比较用户在jsp中的角色:
<c:choose>
<c:when test="${user.role == 'ADMIN'}">
<c:choose>
<c:when test="${active == true}">
<h1>ADMIN</h1>
<nav class="topNav">
<ul>
<li class="selected"><a href="${hostpath}/home">Home</a></li>
<li><a href="${hostpath}/settings">Settings</a></li>
<li><a href="${hostpath}/users">Users</a></li>
<li><a href="${hostpath}/groups">Groups</a></li>
<li><a href="${hostpath}/pdata">PrivateData</a></li>
<li><a href="${hostpath}/secur">Security</a></li>
</ul>
</nav>
</c:when>
<c:otherwise>
<h1>ACTIVATE REGISRATION</h1>
<p>some explanation text</p>
</c:otherwise>
</c:choose>
<br class="clear" />
<br />
</c:when>
<c:otherwise>
如果您的用户可以有多个角色,那么您必须循环浏览这些角色,以检查他是否具有查看菜单所需的角色。
我希望这能帮助你,因为这是我解决问题的方法
您可以使用Spring Security限制用户访问页面,否则您可以创建Java Filter,它将在会话中检查用户的角色,并在用户无权访问页面的情况下将其重定向到未经授权的页面。这取决于你和你正在开发的应用程序的复杂性。
您可以创建一个Filter,即使一个用户与另一个用户共享一些不允许访问的URL,您也可以确定他无法访问。
一个基本的使用示例是这样的:
public class UsersRestrictionFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
logger.debug("URI: {}", request.getRequestURI());
User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
//Here I use spring security from context
if (isRestrictedURL(request.getRequestURI()) && !user.isAdmin()) {
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.sendRedirect(request.getServletContext().getContextPath() + "/notAllowedAccess");
}
//if the user is allowed to access the url continue flow
filterChain.doFilter(servletRequest, servletResponse);
}
private boolean isRestrictedURL(String url){
//your logic to decide if the URL is only for admin users
}
@Override
public void destroy() {
}
}