标签:logo password 用户认证 enc 执行流程 man 技术 ide auto
在说完了Spring Security框架的功能和执行流程后,就到了写它Spring Boot的集成,先来看最简的配置:
<parent>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <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> </dependencies>
此时,直接运行程序,页面会跳出都会弹出一个“需要授权”的验证框:
Spring Security会默认生成一个用户,用户名为user,密码可以再IDE的控制台(Console)中查看,输入用户名和密码后就可以访问请求的URL了。
在我们实际的开发中,肯定需要我们定义访问哪些URL需要登录并拥有相关的权限,访问哪些URL不需要登录,以及验证失败后的跳转页面等。配置方式:定义继承WebSecurityConfigurerAdapter 类WebSecurityConfig类,并加上@Configuration 和@EnableWebSecurity两个注解,开启Spring Security功能,并交由容器进行管理。具体配置如下:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http
.authorizeRequests()
//指定任何用户都可以访问‘/‘路径,permitAll()表示任何用户都可以访问
.antMatchers("/").permitAll()
//以"/admin/"开头的URL,只能让"USER"角色权限的用户访问
.antMatchers("/user/**").hasRole("USER")
.and()
//通过formLogin方法登录,并设置登录url为/login,登录成功后跳转/user页面
.formLogin()
.loginPage("/login").defaultSuccessUrl("/user")
.and()
.logout()
//指定登出的url,登出成功后跳转的url路径
.logoutUrl("/logout").logoutSuccessUrl("/login");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
/**
* 在内存中创建一个名为 "user" 的用户,密码为 "pwd",拥有 "USER" 权限,密码使用BCryptPasswordEncoder加密
*/
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
.withUser("user").password(new BCryptPasswordEncoder().encode("pwd")).roles("USER");
}
/**
* 添加 UserDetailsService, 实现自定义登录校验
*/
@Override
protected void configure(AuthenticationManagerBuilder builder) throws Exception{
builder.userDetailsService(anyUserDetailsService);
}
}
这是Spring Security进行权限校验管理的一个基本配置啦!
其实看到这里心里还是有很多疑惑:
这些疑惑网上早就有人想到了,接着看下面的文章。
在知乎和简书上面找到了两张认证流程的图,直观地展示一下:
图一
图二
在Spring Security入门(二)中提到,用户登录时登录信息会封装在Authentication中,然后传递给AuthenticationManager实例进行验证。Authentication是如何在AuthenticationManager实例中进行验证的?具体的流程就如图一所示:
所以根据图二,大致的验证流程如下:
还记得上文提到说,用户数据存放于数据库时该如何读取用户信息进行认证吗?没错,就是自定义一个UserDetailsService的类,主要是重写它的loadUserByUsername方法,将用户信息封装在UserDetails对象中。看个具体的栗子:
@Service
public class AnyUserDetailService implements UserDetailsService{
//DAO层的代码省略
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// TODO Auto-generated method stub
User user = userMapper.selectByUsername(username);
if(user == null) {
throw new UsernameNotFoundException("用户不存在!");
}
List<SimpleGrantedAuthority> simpleGrantedAuthorities = createAuthorities(user.getRoles());
return new User(userEntity.getUsername(), userEntity.getPassword(), simpleGrantedAuthorities);
}
自定义了类之后还要配置才能生效,还是在WebSecurityConfig类中进行配置,参见上文。
标签:logo password 用户认证 enc 执行流程 man 技术 ide auto
原文地址:https://www.cnblogs.com/linyukun/p/9862730.html