Spring 全家桶之 Spring Security(一)(下)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Spring 全家桶之 Spring Security(一)

a386f9e6ea44435f9d428e76662d539b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

实现了不同的角色拥有不同路径的访问权限

基于JDBC的用户认证

首先修改pom.xml,增加MySQL依赖及JPA

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.18</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

创建实体类UserInfo,添加get/set方法

@Entity
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String username;
    private String password;
    private String role;
}

创建持久层UserInfoDao,继承JpaRepository,定义方法findByUsername(String username)

public interface UserInfoDao extends JpaRepository<UserInfo,Long>{
    //按照username查询数据库
    UserInfo findByUsername(String username);
}

创建service层UserInfoService接口,并创建UserInfoServiceImpl实现类实现该接口

public interface UserInfoService {
    UserInfo findUserInfo(String username);
}

不要忘记@Service注解

@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Autowired
    private UserInfoDao userInfoDao;
    @Override
    public UserInfo findUserInfo(String username) {
        return userInfoDao.findByUsername(username);
    }
}
复制代码

配置application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true
spring.jpa.database=mysql
# 声明创建表时使用InnoDB引擎,默认使用myisam
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

此时启动应用会在数据库中创建user_info表,接着需要初始化user_info表中的数据 在init包下面创建JDBCInit类

@Component
public class JDBCInit {
    @Autowired
    private UserInfoDao userInfoDao;
    @PostConstruct
    public void init(){
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        UserInfo user1 = new UserInfo();
        user1.setUsername("IronMan");
        user1.setPassword(passwordEncoder.encode("12345"));
        user1.setRole("admin");
        userInfoDao.save(user1);
        UserInfo user2 = new UserInfo();
        user2.setUsername("thor");
        user2.setPassword(passwordEncoder.encode("12345"));
        user2.setRole("user");
        userInfoDao.save(user2);
    }
}

接着创建MyUserDetailService,该类继承框架包中的UserDetailService,作用类似于存储用户角色信息

@Component("myUserDetailService")
public class MyUserDetailService implements UserDetailsService {
    @Autowired
    private UserInfoService userInfoService;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        User user = null;
        if (username != null){
            userInfo = userInfoService.findUserInfo(username);
            if (userInfo != null){
                List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
                GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_"+userInfo.getRole());
                grantedAuthorityList.add(authority);
                // 创建User类,框架中的User类
                user = new User(userInfo.getUsername(),userInfo.getPassword(),grantedAuthorityList);
            }
        }
        return user;
    }
}

修改MyWebSecurityConfig,将保存用信息到内存中的代码全部删除

/**
 * prePostEnabled = true表示可以使用@PreAuthorize注解和@PostAuthorize方法级别的注解
 */
@Configuration//表示该类是一个配置类,返回值是Java对象,由SpringIOC管理,相当于配置xml文件
@EnableWebSecurity //表示启用SpringSecurity安全框架功能
@EnableGlobalMethodSecurity(prePostEnabled = true) //启用方法级别的安全控制
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private MyUserDetailService myUserDetailService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
    }
}

HelloSecurityController的代码不变,启动应用,使用IronMan/12345登录,可以访问/hello,/admin

723bc66f642048c4ac9235ddda1cbce8_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

6d698c8f15964b099a9198a57e37e385_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


使用thor/12345登录,访问/hello,/admin

5fcb701002674ecfbb8c1f8f0d49b32d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

5fcb701002674ecfbb8c1f8f0d49b32d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png


b3e1be8999d04e938ecfd46aacdeba21_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据库
实现基于Spring Security的权限管理系统
实现基于Spring Security的权限管理系统
|
4月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
5月前
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
199 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
5月前
|
存储 安全 Java
Spring Security 6.x OAuth2登录认证源码分析
上一篇介绍了Spring Security框架中身份认证的架构设计,本篇就OAuth2客户端登录认证的实现源码做一些分析。
224 2
Spring Security 6.x OAuth2登录认证源码分析
|
5月前
|
安全 Java 数据安全/隐私保护
Spring Security 6.x 一文快速搞懂配置原理
本文主要对整个Spring Security配置过程做一定的剖析,希望可以对学习Spring Sercurity框架的同学所有帮助。
251 5
Spring Security 6.x 一文快速搞懂配置原理
|
5月前
|
安全 Java API
Spring Security 6.x 图解身份认证的架构设计
【6月更文挑战第1天】本文主要介绍了Spring Security在身份认证方面的架构设计,以及主要业务流程,及核心代码的实现
82 1
Spring Security 6.x 图解身份认证的架构设计
|
4月前
|
安全 Java 数据安全/隐私保护
使用Spring Security实现细粒度的权限控制
使用Spring Security实现细粒度的权限控制
|
4月前
|
安全 Java 数据安全/隐私保护
使用Java和Spring Security实现身份验证与授权
使用Java和Spring Security实现身份验证与授权
|
4月前
|
存储 安全 Java
Spring Security在企业级应用中的应用
Spring Security在企业级应用中的应用
下一篇
无影云桌面