赞
踩
passwordEncoder
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10);
}
@Bean
UserDetailsService userDetailsService() {
InMemoryUserDetailsManager users =
new InMemoryUserDetailsManager();
users.createUser(User.withUsername("finlay_user")
.password("$2a$10$uwwZ5EyWbFnnw3JG53rqQ.VJUm/.Pl9Ko1CUP5Aqc2kuBr2Bx7bc.")
.roles("USER")
.build());
以上练习了基于内存的认证,实际上,正式的系统开发都是使用数据库进行认证,在这里练习使用使用数据库的用户数据进行认证。这里使用postgresql
。
USER
表CREATE TABLE "USER"(
id int,
username varchar(32),
password varchar(255),
enabled int,
locked int,
PRIMARY KEY(id)
);
ROLE
表CREATE TABLE "ROLE"(
id int,
name varchar(32),
nameZh varchar(255),
PRIMARY KEY(id)
);
USER_ROLE
表(user
和role
的关系表)CREATE TABLE "USER_ROLE"(
id int,
uid int,
rid int,
PRIMARY KEY(id)
);
USER
表ROLE
表USER_ROLE
表USER
和ROLE
的关系 with uur as (
select
*
from
"USER" u
inner join "USER_ROLE" ur
on u.id = ur.uid
)
select username,namezh,name as rolename from uur
inner join "ROLE" r
on uur.rid = r.id
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.9</version> </dependency>
repository
使用mybatis
,所以引入mybatis
的依赖包。application.properties
定义数据库连接信息。spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/springboot
spring.datasource.username=finlay
spring.datasource.password=123456
mybatis
的interface
,以及xml
文件
User
和Role
的实体类@Data
public class Role {
private Integer id;
private String name;
private String nameZh;
}
@Data public class User implements UserDetails { private Integer id; private String username; private String password; private Boolean enabled; private Boolean locked; private List<Role> roles; @Override public Collection<? extends GrantedAuthority> getAuthorities() { List<SimpleGrantedAuthority> authorities = new ArrayList<>(); for (Role role : roles) { authorities.add(new SimpleGrantedAuthority(role.getName())); } return authorities; } @Override public String getPassword() { return this.password; } @Override public String getUsername() { return this.username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return !this.locked; } @Override public boolean isCredentialsNonExpired(){ return true; } @Override public boolean isEnabled(){ return this.enabled; } }
mybatis
@Mapper
public interface UserMapper {
User loadUserByUserName(String usernam);
List<Role> getUserRolesByUid(Integer id);
}
mybatis
的xml
配置文件<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.repository.mybatis.UserMapper">
<select id="loadUserByUserName" resultType="com.example.demo.authentication.User">
select * from "USER" where username=#{username}
</select>
<select id="getUserRolesByUid" resultType="com.example.demo.authentication.Role">
select * from "ROLE" r, "USER_ROLE" ur where r.id=ur.rid and ur.uid=#{id}
</select>
</mapper>
UserDetailsService
@Service
public class UserService implements UserDetailsService {
@Autowired
public UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userMapper.loadUserByUserName(username);
if (user == null) {
throw new UsernameNotFoundException("username is not found");
}
user.setRoles(userMapper.getUserRolesByUid(user.getId()));
return user;
}
}
UserDetailsService
的bean
,所以spring boot security的
的认证处理,都会使用这个bean
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。