Spring-Security 实现RBAC 权限控制系统

  • 为什么需要使用权限管理框架?

java
复制代码
1.根据角色实现用户访问控制的实现逻辑基本一致,但开发的时候实现复杂,步骤重复 2.简化开发步骤,实现相同代码逻辑快速开发让
  • 常用的权限管理框架有哪些?

    • Shrio 小型企业
    • Security 中,大型企业
  • Security的基本原理是什么?

    java
    复制代码
    1.在用户请求进入tomcat 后 进入dispatcherServlet之前做预处理(过滤器) 2.Security的本质是实现了多个多个过滤器,在每个用户的请求做链式逻辑判断,一旦不符合中间某一个过滤器逻辑,就会被拦截 3.对未登录的用户拦截,并返回一个页面让其登录,进入loadUserByUsername()方法中逻辑处理 4.对登陆的用户保存serssion 5.记住我:将用户信息存入cookie 返回前端浏览器 6.CSRF :仿跨站伪造请求 钓鱼网站恶意获取用户信息,伪造正常用户发送请求,第一次访问时响应tooken,用户登陆时将tooken 提交
  • 实际开发中,用户的信息从哪里来?

    java
    复制代码
    1.第一次登录时,根据用户传过来的用户名和密码,从mysql中拿取数据 2.登陆过,前端传过来cookie,根据cookie信息从redis 中拿取数据
  • Security中如何实现密码加密?

    text
    复制代码
    使用BCryptPasswordEncoder().encode();方法对明文密码使用Bcrypt加密方式加密
  • 记住我的原理是什么?

    java
    复制代码
    记住我:将用户信息存入cookie 返回前端浏览器
  • 什么是CSRF? 解决方案有哪些?

    jav
    复制代码
    1.验证 Referer域 是否是服务端自己认可的域名 2.第一次访问时响应tooken,用户登陆时将tooken 提交
  • 获取用户认证信息

    java
    复制代码
    SecurityContextHolder.getContext().getAuthentication().getPrincipal()

RBAC系统集成Security

Security的授权方式有哪些?如何使用?

  • 在配置类中定义哪个用户具有哪些角色或权限。
  • 在Controller的方法或类上贴上Security提供的注解(配置类需要启用注解@EnableGlobalMethodSecurity)

如何处理没有权限时的异常?

当用户没有权限时,Spring Security会抛出AccessDeniedException。 Security 默认返回一个403视图页面,我们可以实现AccessDeniedHandler口自定义处理方式,通常返回Json 数据 自定义的AccessDeniedException异常处理方式需要在security的配置类中添加:调用http.exceptionHandling() .accessDeniedHandler();

用户的数据从哪里来?如何实现?

  • 用户数据来自数据库。
  • 实现UserDetailsService接口来加载用户数据。

在项目中,如何获取到登录的员工信息?

使用SecurityContextHolder来获取登录的员工信息,如用户名、角色等。

认证器的作用是什么?如何使用认证器?

  • 认证器用于验证用户身份
  • 从上下文从获取用户信息再根据访问提供的用户明和密码作比较.

EmployeeServiceImpl中如何实现登录认证?

  1. 从Controller中接受到用户名和密码,然后将信息封装到UsernamePasswordAuthenticationToken中
  2. 调用认证器authenticationManager.authenticate()方法将Token对象传入认证
  3. 然后调用authenticate.getPrincipal()方法,获取用户信息,并存入Redis中
  4. 前提authenticate.getPrincipal()方法拿到的必须是UserDetails的实现类,且有对应登录的实体类属性.

Security如何检查用户是否有登录?

  1. 可以使用SecurityContextHolder.getContext().getAuthentication()来获取认证信息。
  2. 在自定义过滤器中判断用户是否传入Token,如果有就去Redis中获取对应的用户信息
  3. 将获取到的用户信息封装到UsernamePasswordAuthenticationToken中
  4. 后续过滤器等其他组件会先判断Security上下文是否有用户信息,有信息代表登录了.
  5. 自定义过滤器需要在其他过滤器可能会需要从Security上下文获取用户信息的前面执行,否则后面的过滤器链拿不到用户信息.

在什么时候将用户的认证信息存储起来?

用户的认证信息在登录时存储起来,认证成功后,Security会创建Authentication对象并存储在SecurityContext中。

为什么需要调整过滤器的顺序?

  • 调整过滤器的顺序可以确保请求按照正确的顺序通过过滤器链。
  • 其他过滤器可能会需要从Security上下文获取用户信息,存入用户信息的过滤器如果不前面执行,后面的过滤器链拿不到用户信息.

Security从哪里获取用户的权限? 如何将用户的权限告知Security?

  • 用户的权限通常来自配置或数据库中的角色/权限信息。
  • 通过注解方式/配置类方式标识资源的权限
  • 通过UserDetails的实现类去获取用户的权限信息,并在自定义过滤器中存入Security的上下文中

如何描述接口需要什么权限或者角色?

  • 在配置类中使用AntMatchers方法分配权限或角色
  • @PreAuthorize注解来描述接口需要的权限或角色。

如何处理认证和授权失败的异常?

  • 自定义异常处理器

  • 配置Spring Security的异常处理来处理认证和授权失败的异常,通常会返回状态码和错误信息(Json)

image.png

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP