SpringFramework jsp集受限URL JAVA

SpringFramework jsp集受限URL JAVA,java,spring,jsp,Java,Spring,Jsp,我复制了一个我正在使用的页面示例。如果当前用户是管理员,他可以看到并使用完整菜单,但如果用户是普通用户,他可以看到菜单的剪切版本。问题是,普通用户可以打开url,该url必须仅在用户是管理员时使用 示例: localhost:8080/{hostpath}/users-只有管理员用户必须打开此url,但现在我可以由管理员和普通用户打开 如何限制普通用户的一些url <head> <meta name="viewport" content="width=device-width,

我复制了一个我正在使用的页面示例。如果当前用户是管理员,他可以看到并使用完整菜单,但如果用户是普通用户,他可以看到菜单的剪切版本。问题是,普通用户可以打开url,该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页面中比较该用户角色

    此方法获取当前loggedin用户:

      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>
    
    
    管理
    
    激活区域 一些解释文本


    如果您的用户可以有多个角色,那么您必须循环查看这些角色,以检查他是否具有查看菜单所需的角色


    我希望这能对你有所帮助,因为这是我解决问题的方法。你可以用很多方法来解决你的问题。 我要做的是获取当前loggedin用户。假设您遵循了spring安全约定,一旦您拥有了当前用户,您就可以根据您在应用程序中定义的方式获得该用户的角色,然后将该用户注入模型,现在您可以在jsp页面中比较该用户角色

    此方法获取当前loggedin用户:

      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筛选器,它将在会话中检查用户所扮演的角色,并在用户无权访问页面时将其重定向到未经授权的页面。
    这取决于您和您正在开发的应用程序的复杂性。

    您可以使用Spring Security限制用户访问页面,否则您可以制作一个Java筛选器,该筛选器将在会话中检查用户所扮演的角色,并在用户无权访问页面时将其重定向到未经授权的页面。
    这取决于你和你正在开发的应用程序的复杂性。

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

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

    问题是?@Serge Ballesta如何限制普通用户的一些url?通过实现安全性。。。你把东西藏起来并不是真正的安全。使用Spring安全性(就像使用Spring一样)来应用真正的安全性(还可以使用它来显示/隐藏url。您已经在使用Spring,所以请检查Spring安全性。问题是?@Serge Ballesta如何使一些url对普通用户进行限制?通过实现安全性…隐藏某些内容的事实并不是真正的安全性。使用Spring安全性(就像使用Spring一样)来应用真正的安全性(并使用它来显示/隐藏URL。您已经在使用Spring,所以请查看Spring安全性。最大的问题是