[Spring Cloud]-Spring Security実践(4)-カスタムデータベースモデル方式の認証と認可

4574 ワード

前回の[Spring Cloud]-Spring Security実践(3)-データベース方式の基本認証と認可では、spring securityのデフォルトのデータベースモデルを使用して認証と認証について説明しました.フレームワークで定義されたテーブル構造を使用し、初期ユーザー情報はコードに設定されています.これは実際のプロジェクトの設計と開発には使用できません.まず、データベーステーブル構造はプロジェクトのニーズに合致する構造であるべきです.次に、ユーザ情報をjavaコードにハードコーディングで保存することはできません.したがって、securityフレームワークを引き続き探究し、ユーザーをカスタマイズして取得する方法を実現する必要があります.
この方法は、次のセクションに分けられます.
  • UserDetailsインタフェースを実装ユーザ情報エンティティクラス
  • .
  • データベースクエリーのフレームワークまたは方法-mybatis/jpa/hibernateなど
  • (重要な)UserDetailsServiceインターフェースのサービスは、loadUserByUsernameメソッドを含む必要がある.

  • 1、エンティティークラス
    エンティティクラスは、サービスメソッドの戻り値がこのタイプであるため、UserDetailsインタフェースを実装する必要があります.
    @Data
    public class User implements UserDetails {
        private Long id;
        private String username;
        private String password;
        private String roles;
        private boolean enable;
        private List authorities;
        @Override
     public Collection extends GrantedAuthority> getAuthorities() {
            return this.authorities;
        }
        @Override
     public boolean isAccountNonExpired() {
            return true;
        }
        @Override
     public boolean isAccountNonLocked() {
            return true;
        }
        @Override
     public boolean isCredentialsNonExpired() {
            return true;
        }
        @Override
     public boolean isEnabled() {
            return this.enable;
        }
    }

    2、データベースの準備
    -- spring security user and authority table creation
    create table users (
        id bigint(20) not null auto_increment,
        username varchar(50) not null,
        password varchar(500) not null,
        enable tinyint(4) not null default 1 COMMENT '      ',
        roles text character set utf8 comment '    ,         ',
        primary key (id),
        key username (username)
    )
    INSERT INTO springdemo.users (username, password, roles) VALUES('admin', '{bcrypt}$2a$10$ZaY3jXkyjDsOt/APUzEEluCdnawwb1fK.bYFq4BtNph43uPn/lR3a', 'ROLE_ADMIN,ROLE_USER');
    INSERT INTO springdemo.users (id, username, password, enable, roles) VALUES('USER', '{bcrypt}$2a$10$ZaY3jXkyjDsOt/APUzEEluCdnawwb1fK.bYFq4BtNph43uPn/lR3a', 'ROLE_USER');

    注意:挿入されたパスワードは実際には123で、その中で2つの部分に分かれており、{bcrypt}は暗号化方式を示しており、その後はSystem.out.println(new BCryptPasswordEncoder().encode("123"));で生成することができます.
    3,データベース関連フレームワークの導入
    ここではmybatisを用い,具体的な詳細は後述しない.1、作成mapper
    @Component
    public interface UserMapper {
        @Select("SELECT * FROM users WHERE username=#{username}")
        User findByUserName(@Param("username") String username);
    }

    2、mapperScanをmainクラスに追加すればいい
    @MapperScan("pro.yizheng.mapper")

    3,加mybatis依存
    
    
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        2.1.0
    

    4、データベース構成の追加
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/springdemo?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: 520663

    4,ユーザ情報を取得するサービスを作成する
    これに先立って、ユーザ情報の取得は、技術的に2つの方式である:1、呼び出しInMemoryUserDetailManager、2、呼び出しJdbcUserDetailManager.両方のインプリメンテーションクラスは、UserDetailServiceインタフェースのインプリメンテーションクラスである.このときカスタムデータアーキテクチャを実現する場合、サービスもUserDetailsServiceを実現する
    @Service
    public class UserDetailService implements UserDetailsService {
        @Autowired
     private UserMapper userMapper;
        @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            User user = userMapper.findByUserName(username);
            user.setAuthorities(AuthorityUtils.commaSeparatedStringToAuthorityList(user.getRoles()));
            return user;
        }
        private List generateAuthorities(String roles) {
            List authorities = new ArrayList<>();
            if (roles!=null && !"".equals(roles)){
                String[] roleArray = roles.split(";");
                for (String role : roleArray){
                    authorities.add(new SimpleGrantedAuthority(role));
                }
            }
            return authorities;
        }
    }

    このとき、基本的なカスタムデータベースの認証方式が作成されます.ユーザー/123、admin/123の2人のユーザーによるログイン認証が可能です.