前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot第19集:权限

springboot第19集:权限

作者头像
达达前端
发布2023-10-08 18:22:52
1100
发布2023-10-08 18:22:52
举报
文章被收录于专栏:达达前端达达前端
  • article 文章表
  • sys_permission 后台权限表
  • sys_role 后台角色表
  • sys_role_permission 角色-权限关联表
  • sys_user 用户表
  • sys_user_role 用户-角色关联表
3f9c171b7714d018141593d056c9d3b1.png
3f9c171b7714d018141593d056c9d3b1.png

image.png

3a26f65e3d9c15e813b9138776208235.png
3a26f65e3d9c15e813b9138776208235.png

image.png

sys_user_role

id user_id(用户id) role_id(角色id)

sys_role

id role_name(角色名) create_time(创建时间)update_time(更新时间) delete_status(删除状态)

article

id content(varchar 255 文章内容) create_time(timestamp 创建时间) update_time(timestamp 更新时间) delete_status(varchar 是否有效,1有效,2无效)

13b1c19458b231cbadbe87de6622a3aa.png
13b1c19458b231cbadbe87de6622a3aa.png

image.png

03b62db92922877cdc74cdb1114fccae.png
03b62db92922877cdc74cdb1114fccae.png

image.png

d3612fd506f227bc76cf7b3da2ac9b0c.png
d3612fd506f227bc76cf7b3da2ac9b0c.png

image.png

Spring框架中的@Configuration注解,表示这个类用于配置应用程序上下文。

实现了WebMvcConfigurer接口,这意味着该类将覆盖默认的Spring MVC配置,以便我们可以自定义Web应用程序的行为。

@Autowired注解用于自动装配loginHandler对象,这里的loginHandler是一个实现了Interceptor接口的拦截器实例。

在实现WebMvcConfigurer接口时,必须实现addInterceptors方法。此方法允许我们向注册表中添加自定义拦截器,以便它们能够拦截特定的请求并执行一些逻辑操作。

在addInterceptors方法内部,我们通过registry参数注册了一个loginHandler拦截器。这意味着每次发出HTTP请求时都会调用这个拦截器,并且该拦截器的逻辑将在请求被处理之前或之后执行。

@Configuration@EnableCaching 是Spring框架中的两个注解。

@Configuration 用于标注一个类,表示这个类是一个配置类。Spring容器在启动时,会扫描带有该注解的类,并根据其中的@Bean等注解创建相应的Bean对象。

@EnableCaching 标注在配置类上,表示开启缓存支持。使用该注解时,需要在配置类中配置缓存管理器(如RedisCacheManager)以及缓存的一些参数。如果不配置缓存管理器,则默认使用ConcurrentMapCacheManager。

当我们在Spring应用中需要使用缓存时,只需要添加相应的注解即可,例如:@Cacheable@CachePut@CacheEvict 等。

总之,@Configuration@EnableCaching 注解结合起来使用,可以方便地配置缓存管理器和缓存规则,并在需要缓存的方法上添加缓存注解,从而实现缓存功能。

一个配置类,用于配置默认的缓存管理器,并使用了Spring框架中的一些注解。

  • @Primary 注解用于指定在多个同类型的 Bean 中优先选择哪个 Bean。这里我们将默认的缓存管理器标记为首选项。
  • @Bean 注解用于告诉 Spring 容器,该方法返回的对象要注册为一个 Bean。在这里,我们将返回一个 CaffeineCacheManager 对象作为默认的缓存管理器,并且可以通过其 setCaffeine() 方法来设置一些缓存的属性。
  • 在 setCaffeine() 方法中,我们使用了Caffeine作为缓存实现,并进行了如下设置:
    • expireAfterWrite() 方法设置最后一次写入后经过固定时间过期。
    • initialCapacity() 方法设置初始的缓存空间大小。
    • maximumSize() 方法设置缓存的最大条数。

这样我们就配置好了一个使用 Caffeine 作为缓存实现的默认缓存管理器,其中缓存数据会在 10 秒后过期。当需要使用缓存时,只需要调用该缓存管理器即可。

使用Spring框架中的@Bean注解定义了一个名为"tokenCacheManager"的Bean,它返回了一个由Caffeine库构建的缓存对象。具体注解说明如下:

@Bean("tokenCacheManager"):表示该方法返回一个Bean对象,并将其命名为"tokenCacheManager"。

public Cache<String, SessionUserInfo> caffeineCache():该方法返回值为Caffeine缓存对象,并且该方法可以被其他组件引用,即可通过spring容器获取到这个对象。

return Caffeine.newBuilder():创建一个新的缓存构造器。

.expireAfterAccess(30L, TimeUnit.MINUTES):指定缓存条目在最后一次访问后,在固定时间(30分钟)之后过期。

.initialCapacity(100):设置缓存初始容量为100。

.maximumSize(10000):设置缓存最大容量为10000条数据。

.build():调用build()方法构建Caffeine缓存对象,该缓存对象是Spring框架管理的一个单例Bean,在应用程序运行期间只会创建一次,其他组件可以通过依赖注入的方式来使用它。

MyBatis是一个开源的Java持久层框架,它可以帮助我们简化数据库操作,同时提供了一些高级特性,如自定义SQL、存储过程和高级映射等。MyBatis使得Java程序员能够更加方便地访问关系数据库,并且在操作上比JDBC更加灵活。

MyBatis的主要特点是通过简单的XML或注解来配置和映射原始类型、接口和POJO为数据库中的记录。这使得我们可以将数据库表映射到Java对象,从而进一步简化数据库操作过程。同时,MyBatis还支持动态SQL,允许我们根据运行时条件生成不同的SQL语句,从而实现更加复杂的查询和更新操作。

除此之外,MyBatis还具有良好的性能和可扩展性。它采用了缓存机制,可以缓存SQL语句和查询结果,从而避免了频繁地访问数据库。同时,MyBatis也支持插件机制,允许我们在不修改源码的情况下增强其功能。

总之,MyBatis是一个功能强大且易于使用的Java持久层框架,旨在帮助Java程序员更轻松地访问关系数据库。

使用了@Transactional注解来表示这个方法需要在一个事务中执行,如果出现异常则会回滚事务。具体注解的含义如下:

@Transactional(rollbackFor = Exception.class)

  • @Transactional: 这是Spring框架提供的事务注解,用于表示该方法需要在一个事务中执行。
  • rollbackFor = Exception.class:表示当方法抛出任何异常时,都会让事务回滚。

public JSONObject addArticle(JSONObject jsonObject) {

  • public: 表示该方法可以被其他类调用。
  • JSONObject: 返回值类型为JSONObject对象。
  • addArticle: 方法名,用于添加文章到数据库。
  • (JSONObject jsonObject): 接受一个JSONObject对象作为参数,该对象包含了文章的相关信息。

articleDao.addArticle(jsonObject);

  • articleDao:数据访问对象,通过它来操作数据库。
  • addArticle(jsonObject):调用articleDao对象的addArticle方法添加文章到数据库,传入方法的参数为JSONObject对象。

return CommonUtil.successJson();

  • return: 返回操作结果,这里返回了一个成功的JSONObject对象。
  • CommonUtil:工具类,封装了一些常用的方法。
  • successJson(): 静态方法,返回一个表示操作成功的JSONObject对象。

实现基于 Token 令牌的 Web 应用安全访问控制可以通过以下几个步骤实现:

  1. 生成 Token:Token 可以由服务器生成,也可以由第三方认证服务提供商生成。在生成 Token 时,需要考虑 Token 的有效期、加密方式等因素。
  2. 发送 Token:一旦生成了 Token,服务器需要将它发送给客户端。通常情况下,Token 在 HTTP 请求头中发送,例如 Authorization 头部中包含 Bearer Token。
  3. 验证 Token:服务器在接收到请求时,需要从请求头中获取 Token,并对其进行验证。验证 Token 的过程通常涉及到解密、解析、校验有效期等步骤。
  4. 授权访问:如果 Token 验证通过,服务器会对请求进行授权访问。通常情况下,服务器会将用户的权限信息存储在 Token 中,在进行授权访问时,需要先解析出用户的权限信息,然后再进行访问控制。

实现纯 Token 认证的 Web 应用时,可以通过关闭 Spring Security 自带的 Session、允许跨域请求,并增加一个 Token 拦截器来拦截所有请求并验证 Token 令牌是否有效。具体实现可参考以下步骤:

  1. 关闭 Spring Security 自带的 Session:在 SecurityConfig 类中,可以通过 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 的方式关闭 Session。
  2. 允许跨域请求:在 SecurityConfig 类中,可以通过 .cors() 的方式允许跨域请求。
  3. 增加 Token 拦截器:创建一个 TokenInterceptor 类,实现 HandlerInterceptor 接口,并在 preHandle 方法中对 Token 进行验证。如果 Token 验证失败,可以返回错误信息或者直接拒绝请求。
  4. 注册 Token 拦截器:在 WebMvcConfigurer 中注册 TokenInterceptor,使其生效。

如果想要实现 Session + Token 认证的 Web 应用,可以增加 Session、Token 拦截器来拦截所有请求,并根据请求是否带 Cookie 进行不同的认证授权。具体实现可参考以下步骤:

  1. 创建 SessionInterceptor 类和 TokenInterceptor 类,并实现 HandlerInterceptor 接口。在 preHandle 方法中,分别对 Session 和 Token 进行验证。
  2. 在 SecurityConfig 类中,关闭 Spring Security 自带的 Session,并增加一个 RememberMeConfigurer,将 Session ID 存储在 Cookie 中。
  3. 注册 SessionInterceptor 和 TokenInterceptor,使其生效。
  4. 在 TokenInterceptor 中,判断请求是否带有 Cookie。如果带有 Cookie,则使用 Session 进行认证授权,否则使用 Token 进行认证授权。

需要注意的是,虽然 Token 令牌不保存用户的认证信息,但是 Token 仍然需要进行加密处理以保证安全性。另外,在 Token 令牌的有效期到期之前,服务器需要定期更新 Token。

HTTP 协议本身是无状态的,也就是说服务器并不知道用户是否已经登录。为了解决这个问题,通常有以下两种方法:

  1. 基于 Session 的身份验证

在基于 Session 的身份验证中,当用户第一次登录成功后,服务器会创建一个对应该用户的 Session,并将 Session ID 返回给客户端。客户端每次请求时需要带上该 Session ID,服务器通过验证 Session ID 来确定用户是否已经登录。

具体实现方式是:用户第一次登录成功后,服务器会生成一个唯一的 Session ID,并将该 ID 存储在某个地方(例如内存、数据库等)和客户端的 Cookie 中。当客户端再次请求时,会带上存储在 Cookie 中的 Session ID,服务器通过验证该 Session ID 来确定用户是否已经登录。如果 Session ID 有效,则认为用户已经登录;否则,认为用户未登录。

优点:相对简单易用,适合小型项目。

缺点:需要在服务器端保存 Session ID,占用一定的内存资源;同时,如果用户量较大,会导致服务器的性能瓶颈。

  1. 基于 Token 的身份验证

在基于 Token 的身份验证中,当用户第一次登录成功后,服务器会生成一个 Token,并将该 Token 返回给客户端,客户端每次请求时需要带上该 Token,服务器通过验证 Token 来确定用户是否已经登录。

具体实现方式是:用户第一次登录成功后,服务器会生成一个唯一的 Token,并将该 Token 存储在某个地方(例如 Redis、数据库等)和客户端的 Cookie 或者请求头中。当客户端再次请求时,会带上存储在 Cookie 或者请求头中的 Token,服务器通过验证该 Token 来确定用户是否已经登录。如果 Token 有效,则认为用户已经登录;否则,认为用户未登录。

优点:相对于 Session,不需要在服务器端保存状态信息,极大降低了服务器的压力,适合分布式系统。

缺点:实现相对复杂,需要考虑 Token 的安全性和有效期等问题。

总之,选择使用哪种身份验证方式取决于具体项目的需求和场景。如果是小型项目,可以选择基于 Session 的身份验证方式;如果是大型项目或者分布式系统,可以选择基于 Token 的身份验证方式。

基于 Session 的认证方法是一种常用的用户身份验证方式,其主要流程如下:

  1. 用户登录:用户在客户端输入用户名和密码进行登录。
  2. 服务端生成 Session:服务器在接收到用户登录请求后,会为该用户生成一个 Session,并将 Session ID 返回给客户端。通常情况下,Session ID 会被存储在 Cookie 中。
  3. 客户端发送请求:客户端每次向服务器发送请求时,都会带上存储在 Cookie 中的 Session ID。
  4. 服务端验证 Session:服务器在接收到请求后,会根据 Session ID 去查找相应的 Session。如果能够找到对应的 Session,就说明用户已经通过了身份验证,可以继续执行后续操作;否则,就需要提示用户重新登录或者返回错误信息。
  5. Session 管理:在用户退出登录或者一段时间不活跃之后,服务器需要及时销毁对应的 Session,释放资源。

需要注意的是,在分布式系统中,基于 Session 的认证方法需要考虑跨服务的问题。通常情况下,可以将 Session 存储在共享缓存(例如 Redis)中,以实现多个服务之间的 Session 共享。同时,为了保证安全性,还需要对 Session 进行加密处理,防止被恶意攻击者盗取或者篡改。

另外,基于 Session 的认证方法还有一些可拓展的方式,例如使用 JWT(JSON Web Token)替代 Session、使用 Spring Security 等第三方库来简化身份验证流程等。不同的拓展方式有着不同的适用场景和优缺点,需要根据具体项目需求进行选择。

基于 Token 的认证方法是一种不依赖于服务端 Session 的身份验证方式,其主要流程如下:

  1. 用户登录:用户在客户端输入用户名和密码进行登录。
  2. 生成 Token:服务器在接收到用户登录请求后,会根据一定的加密算法和密钥对用户信息进行加密处理,生成一个 Token,并将 Token 返回给客户端。
  3. 客户端保存 Token:客户端在接收到服务器返回的 Token 后,会将其保存起来,通常情况下,Token 会被存储在客户端的 localStorage 或者 sessionStorage 中,并在每次向服务器发送请求时带上该 Token。
  4. 服务端验证 Token:服务器在接收到请求后,会根据预先设定的密钥对 Token 进行解密,并校验 Token 的有效性。如果 Token 有效,则说明用户已经通过了身份验证,可以继续执行后续操作;否则,就需要提示用户重新登录或者返回错误信息。
  5. Token 管理:在用户退出登录或者一段时间不活跃之后,服务器需要及时销毁对应的 Token,以保护用户的安全。

需要注意的是,在实现基于 Token 的认证方法时,需要考虑 Token 的安全性和有效期问题。为了保证安全性,通常会使用一些加密算法(例如 HMAC、RSA)对 Token 进行加密处理,从而防止 Token 被恶意攻击者盗取或者篡改。同时,为了防止 Token 被长时间滥用,还需要设置 Token 的有效期,并定期更新 Token。

另外,基于 Token 的认证方法还有一些可拓展的方式,例如使用 JWT(JSON Web Token)、OAuth 2.0 等开放标准协议来实现认证授权等。不同的拓展方式有着不同的适用场景和优缺点,需要根据具体项目需求进行选择。

验证码生成流程:前端发起验证码请求,后端程序生成验证码,将当前验证码信息保存到session并设置过期时间,返回前端base64编程等格式数据,前端处理验证码显示

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档