spring boot(学习笔记第十四课)

打印 上一主题 下一主题

主题 547|帖子 547|积分 1641

spring boot(学习笔记第十四课)



  • Spring Security的暗码加密,基于数据库认证

学习内容:


  • Spring Security的暗码加密
  • 基于数据库认证

1. Spring Security的暗码加密


  • 假如用户的暗码保存在数据库中是以明文保存,对于公司的安全将是灾难性的,哪个公司也不会允许用户数据利用明文保存。这里练习利用加密之后的暗码进行认证。
    留意,如许公司的数据库内里是没有用户的明文暗码,纵然数据库泄露,也不会暴漏用户的明文暗码

  • 实现暗码加密

    • 配置passwordEncoder
      1. @Bean
      2. PasswordEncoder passwordEncoder() {
      3.    return new BCryptPasswordEncoder(10);
      4. }
      复制代码
    • 手动根据明文暗码生成密文暗码
      bcrypt转换工具
      留意,每次生成的暗码都不一样,但是每个生成的都好用

    • 利用生成的密文进行用户的创建。
      1. @Bean
      2.     UserDetailsService userDetailsService() {
      3.         InMemoryUserDetailsManager users =
      4.                 new InMemoryUserDetailsManager();
      5.         users.createUser(User.withUsername("finlay_user")
      6.                 .password("$2a$10$uwwZ5EyWbFnnw3JG53rqQ.VJUm/.Pl9Ko1CUP5Aqc2kuBr2Bx7bc.")
      7.                 .roles("USER")
      8.                 .build());
      复制代码
    • 再次进行认证。


2. 基于数据库认证

以上练习了基于内存的认证,实际上,正式的体系开辟都是利用数据库进行认证,在这里练习利用利用数据库的用户数据进行认证。这里利用postgresql。

  • 首先创建数据库需要的表

    • 创建USER表
      1. CREATE TABLE "USER"(
      2. id int,
      3. username varchar(32),
      4. password varchar(255),
      5. enabled int,
      6. locked int,
      7. PRIMARY KEY(id)
      8. );
      复制代码
    • 创建ROLE表
      1. CREATE TABLE "ROLE"(
      2. id int,
      3. name varchar(32),
      4. nameZh varchar(255),
      5. PRIMARY KEY(id)
      6. );
      复制代码
    • 创建USER_ROLE表(user和role的关系表)
      1. CREATE TABLE "USER_ROLE"(
      2. id int,
      3. uid int,
      4. rid int,
      5. PRIMARY KEY(id)
      6. );
      复制代码
    • 用户数据如下:

      • USER表

      • ROLE表

      • USER_ROLE表

      • USER和ROLE的关系
        1.                         with uur as (
        2.                             select
        3.                                 *
        4.                             from
        5.                                 "USER" u
        6.                                 inner join "USER_ROLE" ur
        7.                                     on u.id = ur.uid
        8.                         )
        9.                         select username,namezh,name as rolename from uur
        10.                             inner join "ROLE" r
        11.                                 on uur.rid = r.id
        复制代码



  • 引入须要的依赖
    1.                 <dependency>
    2.             <groupId>org.springframework.boot</groupId>
    3.             <artifactId>spring-boot-starter-security</artifactId>
    4.         </dependency>
    5.         <dependency>
    6.             <groupId>org.mybatis.spring.boot</groupId>
    7.             <artifactId>mybatis-spring-boot-starter</artifactId>
    8.             <version>3.0.3</version>
    9.         </dependency>
    10.         <dependency>
    11.             <groupId>org.projectlombok</groupId>
    12.             <artifactId>lombok</artifactId>
    13.             <scope>provided</scope>
    14.         </dependency>
    15.         <dependency>
    16.             <groupId>org.postgresql</groupId>
    17.             <artifactId>postgresql</artifactId>
    18.             <scope>runtime</scope>
    19.         </dependency>
    20.         <dependency>
    21.             <groupId>com.alibaba</groupId>
    22.             <artifactId>druid</artifactId>
    23.             <version>1.2.9</version>
    24.         </dependency>
    复制代码
    这里repository利用mybatis,所以引入mybatis的依赖包。
  • 在application.properties定义数据库毗连信息。
    1. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
    2. spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
    3. spring.datasource.username=finlay
    4. spring.datasource.password=123456
    复制代码
  • 定义mybatis的interface,以及xml文件

    • 定义User和Role的实体类
      1. @Data
      2. public class Role {
      3.     private Integer id;
      4.     private String name;
      5.     private String nameZh;
      6. }
      复制代码
      1. @Data
      2. public class User implements UserDetails {
      3.     private Integer id;
      4.     private String username;
      5.     private String password;
      6.     private Boolean enabled;
      7.     private Boolean locked;
      8.     private List<Role> roles;
      9.     @Override
      10.     public Collection<? extends GrantedAuthority> getAuthorities() {
      11.         List<SimpleGrantedAuthority> authorities = new ArrayList<>();
      12.         for (Role role : roles) {
      13.             authorities.add(new SimpleGrantedAuthority(role.getName()));
      14.         }
      15.         return authorities;
      16.     }
      17.     @Override
      18.     public String getPassword() {
      19.         return this.password;
      20.     }
      21.     @Override
      22.     public String getUsername() {
      23.         return this.username;
      24.     }
      25.     @Override
      26.     public boolean isAccountNonExpired() {
      27.         return true;
      28.     }
      29.     @Override
      30.     public boolean isAccountNonLocked() {
      31.         return !this.locked;
      32.     }
      33.     @Override
      34.     public boolean isCredentialsNonExpired(){
      35.         return true;
      36.     }
      37.     @Override
      38.     public boolean isEnabled(){
      39.         return this.enabled;
      40.     }
      41. }
      复制代码
    • 配置mybatis
      1. @Mapper
      2. public interface UserMapper {
      3.     User loadUserByUserName(String usernam);
      4.     List<Role> getUserRolesByUid(Integer id);
      5. }
      复制代码
    • 配置mybatis的xml配置文件
      1. <!DOCTYPE mapper
      2.         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      3.         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      4. <mapper namespace="com.example.demo.repository.mybatis.UserMapper">
      5.     <select id="loadUserByUserName" resultType="com.example.demo.authentication.User">
      6.         select * from "USER" where username=#{username}
      7.     </select>
      8.     <select id="getUserRolesByUid" resultType="com.example.demo.authentication.Role">
      9.         select * from "ROLE" r, "USER_ROLE" ur where r.id=ur.rid and ur.uid=#{id}
      10.     </select>
      11. </mapper>
      复制代码

  • 定义UserDetailsService
    1. @Service
    2. public class UserService implements UserDetailsService {
    3.     @Autowired
    4.     public UserMapper userMapper;
    5.     @Override
    6.     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    7.         User user = userMapper.loadUserByUserName(username);
    8.         if (user == null) {
    9.             throw new UsernameNotFoundException("username is not found");
    10.         }
    11.         user.setRoles(userMapper.getUserRolesByUid(user.getId()));
    12.         return user;
    13.     }
    14. }
    复制代码
    留意,这里生成了UserDetailsService的bean,所以spring boot security的的认证处理,都会利用这个bean
  • 团体的架构

  • 测试认证结果


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表