[Spring Cloud]-Spring Security実践(4)-カスタムデータベースモデル方式の認証と認可
4574 ワード
前回の[Spring Cloud]-Spring Security実践(3)-データベース方式の基本認証と認可では、spring securityのデフォルトのデータベースモデルを使用して認証と認証について説明しました.フレームワークで定義されたテーブル構造を使用し、初期ユーザー情報はコードに設定されています.これは実際のプロジェクトの設計と開発には使用できません.まず、データベーステーブル構造はプロジェクトのニーズに合致する構造であるべきです.次に、ユーザ情報をjavaコードにハードコーディングで保存することはできません.したがって、securityフレームワークを引き続き探究し、ユーザーをカスタマイズして取得する方法を実現する必要があります.
この方法は、次のセクションに分けられます. .データベースクエリーのフレームワークまたは方法-mybatis/jpa/hibernateなど (重要な)
1、エンティティークラス
エンティティクラスは、サービスメソッドの戻り値がこのタイプであるため、UserDetailsインタフェースを実装する必要があります.
2、データベースの準備
注意:挿入されたパスワードは実際には
3,データベース関連フレームワークの導入
ここではmybatisを用い,具体的な詳細は後述しない.1、作成
2、mapperScanをmainクラスに追加すればいい
3,加mybatis依存
4、データベース構成の追加
4,ユーザ情報を取得するサービスを作成する
これに先立って、ユーザ情報の取得は、技術的に2つの方式である:1、呼び出し
このとき、基本的なカスタムデータベースの認証方式が作成されます.ユーザー/123、admin/123の2人のユーザーによるログイン認証が可能です.
この方法は、次のセクションに分けられます.
UserDetails
インタフェースを実装ユーザ情報エンティティクラス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人のユーザーによるログイン認証が可能です.