Spring Security3源码分析(9)-SecurityContextHolderAwareRequestFilter分析

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

SecurityContextHolderAwareRequestFilter过滤器对应的类路径为

org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter

从类名称可以猜出这个过滤器主要是包装请求对象request的,看源码

Java代码

  1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
  2. throws IOException, ServletException {
  3. chain.doFilter(new SecurityContextHolderAwareRequestWrapper((HttpServletRequest) req, rolePrefix), res);
  4. }

SecurityContextHolderAwareRequestWrapper类对request包装的目的主要是实现servlet api的一些接口方法isUserInRole、getRemoteUser

Java代码

  1. //从SecurityContext中获取认证实体Authentication
  2. private Authentication getAuthentication() {
  3. Authentication auth = SecurityContextHolder.getContext().getAuthentication();
  4. if (!authenticationTrustResolver.isAnonymous(auth)) {
  5. return auth;
  6. }
  7. return null;
  8. }
  9. //实现getRemoteUser方法。首先获取认证实体,再从认证实体中获取登录账号
  10. @Override
  11. public String getRemoteUser() {
  12. Authentication auth = getAuthentication();
  13. if ((auth == null) || (auth.getPrincipal() == null)) {
  14. return null;
  15. }
  16. if (auth.getPrincipal() instanceof UserDetails) {
  17. return ((UserDetails) auth.getPrincipal()).getUsername();
  18. }
  19. return auth.getPrincipal().toString();
  20. }
  21. //实现getUserPrincipal方法
  22. @Override
  23. public Principal getUserPrincipal() {
  24. Authentication auth = getAuthentication();
  25. if ((auth == null) || (auth.getPrincipal() == null)) {
  26. return null;
  27. }
  28. return auth;
  29. }
  30. //判断是否授权。这里注意一下rolePrefix,就是角色的前缀
  31. private boolean isGranted(String role) {
  32. Authentication auth = getAuthentication();
  33. if( rolePrefix != null ) {
  34. role = rolePrefix + role;
  35. }
  36. if ((auth == null) || (auth.getPrincipal() == null)) {
  37. return false;
  38. }
  39. Collection authorities = auth.getAuthorities();
  40. if (authorities == null) {
  41. return false;
  42. }
  43. for (GrantedAuthority grantedAuthority : authorities) {
  44. if (role.equals(grantedAuthority.getAuthority())) {
  45. return true;
  46. }
  47. }
  48. return false;
  49. }
  50. //实现isUserInRole
  51. @Override
  52. public boolean isUserInRole(String role) {
  53. return isGranted(role);
  54. }

这个过滤器看起来很简单。目的仅仅是实现java ee中servlet api一些接口方法。

一些应用中直接使用getRemoteUser方法、isUserInRole方法,在使用spring security时其实就是通过这个过滤器来实现的。


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring Security3源码分析(9)-SecurityContextHolderAwareRequestFilter分析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏