Spring Boot集成Security

参考: https://blog.csdn.net/code__code/article/details/53885510
http://www.cnblogs.com/fenglan/category/887982.html

Spring MVC集成Spring Security实现功能:
1、用户在登录页输入用户名、密码;
2、拦截器验证用户名密码,然后将用户信息、用户所属权限(角色)列表、资源(菜单)和权限(角色)对应关系返回,并将用户信息存储到Session中;
3、用户登录成功后,跳转到欢迎页,然后再重新查询需要显示的菜单列表;
4、当用户访问某一个资源(菜单),通过Session判断用户身份,然后通过在拦截器中获取的对应关系判断用户是否拥有访问权限。

细分角色和权限,并将用户、角色、权限和资源均采用数据库存储,并且自定义过滤器,代替原有的FilterSecurityInterceptor过滤器 并分别实现AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中进行相应配置。

这里写图片描述

  • WebSecurityConfig extends WebSecurityConfigurerAdapter全局配置;
  • CustomUserDetailsService 从数据库中获取用户信息和权限(角色)信息;
  • CustomInvocationSecurityMetadataSourceService implements
    FilterInvocationSecurityMetadataSource 形成资源(菜单)和权限(角色)的对应列表,一个Map(key是资源url,value是权限)。
  • CustomAccessDecisionManager implements AccessDecisionManager 判断用户是否对某个资源有访问权限。
  • MyFilterSecurityInterceptor 自定义过滤器,需要注入CustomInvocationSecurityMetadataSourceService ,CustomAccessDecisionManager 等。
  • -

流程图:
这里写图片描述

前后端分离时使用Spring Security参考:
https://blog.csdn.net/u012702547/article/details/79019510

由于Security将用户及权限信息存储在Session中,所以在分布式环境中就存在Session同步问题,解决方案:
1、使用ip_hash或者session同步。
2、将用户登录信息储存到Redis这种中间件中,然后返回用户token,当用户带着token来访问时,如果Redis中存在用户数据,就要向Security中装入一次用户权限数据(可以先从Security中获取查看是否有用户数据,如果没有就装入)。

参考:https://blog.csdn.net/zhangchen2449/article/details/52623122#t14
在WebSecurityConfig 中添加.successHandler(loginSuccessHandler())

猜你喜欢

转载自blog.csdn.net/sinat_37138973/article/details/79928824