1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
2、配置数据库
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql:///security
mybatis.type-aliases-package=cn.cong.entity
mybatis.mapper-locations=classpath*:mapper/*.xml
3、创建实体类(get/set方法省略)
public class Role {
private Integer id;
private String name;
private String nameZh;
}
@Alias("user")
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<>();
roles.stream().forEach(role -> {
authorities.add(new SimpleGrantedAuthority(role.getName()));
});
return authorities;
}
//获取当前用户对象的密码
@Override
public String getPassword() {
return password;
}
//获取当前用户对象的用户名
@Override
public String getUsername() {
return username;
}
//当前账户是否未过期
@Override
public boolean isAccountNonExpired() {
return true;
}
//当前账户是否未锁定
@Override
public boolean isAccountNonLocked() {
return !locked;
}
//当前账户密码是否未过期
@Override
public boolean isCredentialsNonExpired() {
return true;
}
//当前账户是否可用
@Override
public boolean isEnabled() {
return enabled;
}
}
4、创建service(只是查询,没必要开启事务)
@Service
@Transactional
public class UserService implements UserDetailsService {
@Autowired
UserMapper userMapper;
//通过用户名去数据库中查询用户
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
User user = userMapper.loadUserByUsername(username);
if(user == null){
throw new UsernameNotFoundException("用户不存在");
}
user.setRoles(userMapper.getUserRolesByUid(user.getId()));
return user;
}
}
5、创建Mapper
public interface UserMapper {
User loadUserByUsername(String username);
List<Role> getUserRolesByUid(Integer id);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.cong.mapper.UserMapper">
<select id="loadUserByUsername" resultType="user">
select * from user where username = #{username}
</select>
<select id="getUserRolesByUid" resultType="role">
select * from role r, user_role ur where r.id = ur.rid and ur.uid = #{id}
</select>
</mapper>
6、配置Security
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserService userService;
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder(10);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService);
}
@Override
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests()
.antMatchers("/admin/**/").hasRole("admin")
.antMatchers("/db/**/").hasRole("dba")
.antMatchers("/user/**/").hasRole("user")
.anyRequest().authenticated()
.and()
.formLogin()
.loginProcessingUrl("/login").permitAll()
.and()
.csrf().disable();
}
}
7.创建Controller
@RestController
public class UserController {
@GetMapping("/admin/hello")
public String admin(){
return "hello admin!";
}
@GetMapping("/user/hello")
public String user(){
return "hello user!";
}
@GetMapping("/db/hello")
public String dba(){
return "hello dba";
}
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
特别注意:如果是在IDEA开发整合mybatis,默认情况下,src/main/java下的xml不会被编译,如果mapper.xml和接口类同目录,
需要在pom.xml的<build>中加入以下配置:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>