security应用程序中使用SecurityContextHolder的security util

时间:2014-10-15 09:42:52

标签: java spring spring-mvc spring-security

在我的spring应用程序中,我有一些方面的控制器方法,我做了一些安全检查。因为我经常需要几个检查,所以我把它们包装成了一个" sercurityUtil"的静态辅助方法。类:

public abstract class SecurityUtils {

    public static Authentication getCurrentAuthentication(){
        return SecurityContextHolder.getContext().getAuthentication();
    }

    public static ChroniosUser getAuthenticatedUser(){
        return (ChroniosUser) getCurrentAuthentication().getPrincipal();
    }

    public static boolean authenticationHasRole(Authentication authentication, Role role){
        SimpleGrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleIdentifier());
        return authentication.getAuthorities().contains(grantedAuthority);
    }

    public static boolean authenticatedUserIsAdmin(){
        Authentication authentication = getCurrentAuthentication();
        return authenticationHasRole(authentication, ADMIN);
    }

    ...
}

这是一种有效且好的方法吗? 或关闭我将这些辅助函数包装到spring服务中?

谢谢。

PS:我知道我可以使用@PreAuthorize ...但我的方面更复杂。

1 个答案:

答案 0 :(得分:1)

简短的回答是:

它似乎是一种有效且好的方法。

答案很长:

取决于你。

Spring Security文档声明其基础结构完全基于标准servlet过滤器,并且没有与任何特定Web技术的强大链接,包括Spring MVC

  

Spring Security的Web基础架构完全基于标准   servlet过滤器。它不使用servlet或任何其他基于servlet的   框架(如Spring MVC)内部,因此它没有强大的链接   任何特定的网络技术。它涉及HttpServletRequest和。{   HttpServletResponse并且不关心请求是否来自   浏览器,Web服务客户端,HttpInvoker或AJAX应用程序

[Spring Security Reference - 1. The Security Filter Chain]

它的使用几乎完全基于SecurityContextHolder。提供的示例是通过静态方法:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

如您所见,它不是Spring Bean / Service / Component。 SecurityContextHolder本身看起来像一个实用程序类。

现在您可以创建一个Spring服务来公开它,或者您可以通过经典的Util class使用它,具体取决于您和您的应用程序更实用。