SpringFramework jsp设置限制网址JAVA

时间:2016-05-11 13:18:51

标签: java spring jsp

我复制了一个我正在使用的页面示例。如果当前用户是管理员,他可以查看并使用完整菜单,但如果用户是常规用户,他可以看到菜单的剪切版本。问题是普通用户可以打开网址,只有用户是管理员才能使用。

示例: localhost:8080 / {hostpath} / users - 只有管理员用户必须打开此网址,但现在我可以由管理员和普通用户打开。

如何使一些网址限制为普通用户?

<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>

3 个答案:

答案 0 :(得分:1)

您可以通过多种方式解决问题。 我的方式是获取当前登录用户。假设您已遵循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>

如果您的用户可以拥有多个角色,那么您必须遍历角色以检查他是否具有查看菜单所需的角色。

我希望这可以帮助你,因为这是我解决问题的方式

答案 1 :(得分:1)

您可以使用Spring Security限制用户访问某个页面,否则您可以创建一个Java过滤器,该过滤器将在会话中检查用户具有哪个角色,如果他没有访问权限,则将其重定向到未经授权的页面这页纸。 这取决于您和您正在开发的应用程序的复杂性。

答案 2 :(得分:1)

您可以创建一个过滤器,即使一个用户与另一个不允许的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() {
   }

}