上一篇文章讲到初次使用springboot整合security
不知道的朋友请翻看上一篇
由于上次重写过 configure
方法,这次我们直接在上一次的基础上进行改造
1、添加 mysql
所需要的依赖,同时在 application.yml
文件中添加DataSource
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
spring:
application:
name: security-demo
datasource:
url: jdbc:mysql://localhost:3306/spring_cloud?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: your username
password: your password
driver-class-name: com.mysql.cj.jdbc.Driver
2、编写实体类
SpringSecurity
jar包中为我们准备了 UserDetails
接口,这里我们直接实现这个接口,并将自己所需要的属性封装到其中
刚刚实现接口和我这里的代码不一样,注意看
@Data
public class UserPO implements UserDetails {
private String username;
private String password;
private Integer status;
private Collection<GrantedAuthority> roles;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return this.roles;
}
@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 true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
这样我们的数据就可以存放到数据当中了,当然还需要sql语句和数据库的支撑
这里我就偷个懒,数据库的表,dao层的那些就不写了,主要完成这后面的逻辑
3、新建 UserService.java
文件,实现UserDetailsService 去自定义存储判断规则
@Service
public class UserService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
/**
*
* @param s 这里的 s 代表传来的 username 要去匹配一个用户实体
* @return
* @throws UsernameNotFoundException
*/
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
UserPO user = userMapper.getUserByUsername(s);
System.out.println(user);
return user == null ? new UserPO() : user;
}
}
4、重写SecurityConfig文件中的configure方法
@Autowired
private UserService userService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 配置自定义存储及 password 加密方式
auth.userDetailsService(userService)
.passwordEncoder(passwordEncoder());
}
5、最后在配置安全规则
这里重写的也是
configure
方法,但是请注意参数
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 配置访问路径所需要的身份权限
.antMatchers("/user/**","/admin/**").hasRole("admin")
.antMatchers("/user/**").hasRole("user")
// 任何人都可以访问的路径
.antMatchers("/any/**","/","/login").permitAll()
// 配置登录页面和主页
.and()
.formLogin()
.defaultSuccessUrl("/home")
.and()
.logout()
.logoutSuccessUrl("/");
}
源码地址 戳这里。