2017-05-25 170 views
0

Spring安全性提供了保护页面和重定向用户访问被拒绝页面的好方法。我期望使用spring security来做的事情是,如果用户试图访问页面A并且他无权访问,我希望用户留在同一页面上查看所有相关的菜单项(菜单项提供了如果他们购买该权利,他们会得到什么样的想法),同时我想告诉用户访问被拒绝,他们需要购买该频道。Spring Security授权:保护webapge的部分

我大概可以通过<security:authorize标签来做到这一点,但由于我的应用程序中的内容组织方式,我想在url级别上做到这一点。

回答

0

我们做了一些类似的为我们的产品

  1. 在安全性方面,RememberMeAuthenticationToken使用弹簧库中,以便用户的创建类型的认证匿名/记得,我的类型
Authentication authentication = rememberMeServices.createSuccessfulAuthentication(request, 
    userDetails); 

2.创建这些API在JSP页面中使用

public static boolean isFullyAuthenticated() { 
    SecurityContext securityContext = SecurityContextHolder.getContext(); 
    if (securityContext != null) { 
    Authentication authentication = securityContext.getAuthentication(); 
    return isFullyAuthenticated(authentication); 
    } 
    return false; 

} 

public static boolean isFullyAuthenticated(Authentication authentication) { 
    return !authenticationTrustResolver.isAnonymous(authentication) && !authenticationTrustResolver 
    .isRememberMe(authentication); 
} 

其中authenticationTrustResolver由Spring提供 AuthenticationTrustResolver authenticationTrustResolver = new AuthenticationTrustResolverImpl();

  • 在JSP中添加必要的检查
  • <%if(isFullyAuthenticated()){%> 
     
        //Menu option with links 
     
        <%}else{%> 
     
    //menu option which shows popup/ msgs 
     
        <%}%>

    注:该实用程序方法明确写出,因为我们没能找到rememberme /匿名用户的安全标签

    +0

    感谢Amirutha,我认为类似的解决方案可以使用spring security提供的选项卡库来实现,但它也是开发人员可以使用的东西为了使其发挥作用,我从框架的角度来看待更多,如果有一个“正确”的方法来实现这一点,那就是Spring Security推荐的方法。 –

    0

    我认为你应该这样做,实施自定义org.springframework.security.web.access.AccessDeniedHandler。每当用户尝试访问无权访问的页面时,该页面将被抛出。在handle方法中,您收到的参数为HttpServletRequest,您可以使用该方法对每个请求端点进行一种特定的处理。

    @Override 
        public void handle(HttpServletRequest request, HttpServletResponse response, 
         AccessDeniedException accessDeniedException) 
           throws IOException, ServletException { 
    
         String errorPage = doSomethingWithRequestUri(request); 
         response.sendRedirect(errorPage); 
    
        } 
    

    但是你必须非常小心,这样如果您尝试重定向到相同的URL,用户试图进入你会爱上一个无限循环重定向。也许你应该使用授权/非授权模式,比如这个:

    • /授权/动作/一
    • /授权/动作/一

    你可能已经想到了这一点,你已经实现了解决方案...因此,在AccessDeniedHandler实现中,您应该注意授权/未授权的url关系

    相关问题