在我的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 ...但我的方面更复杂。答案 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使用它,具体取决于您和您的应用程序更实用。