springsecurity使⽤基础教程
spring security使⽤基础教程
spring security
本⽂是基于springboot搭建的微服务架构上,在没有任何权限框架基础的情况加,整合security。下⾯介绍添加security的整个过程,并贴出相关代码。如有其它细节问题欢迎留⾔,⽇后重新整理升级⽂档。
1.添加依赖
针对其中的⼀个web应⽤进⾏权限框架添加,⾸先向l加⼊依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.添加依赖后启动,默认配置⽣效(http basic认证⽅式)
添加依赖后启动,⽇志中会出现临时密码,其实这时候框架已经⽣效,访问任意⼀个请求,会弹出认证框,⽤户名默认为user,⽇志的那个密码就是在这⾥使⽤。但是到这⾥这只是⼀个简单demo,我们不可能这样来使⽤⽹站。
3.修改验证⽅式
⾸先创建config包并创建mySecurityConfig,java⽂件,实现WebSecurityConfigurerAdapter 后重写⽅法configure(HttpSecurity http) ,该⽅法是默认的权限⽅。最后添加上类注解@EnableWebSecurity,修改后如下
@EnableWebSecurity
jquery框架使用public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();//通过表单验证⽅式
}
}
修改后的验证如图所⽰:
4.⾃定义认证获取⽤户信息
我们在⽇常开发中不可能使⽤启动后的固定随机码作为密码登录,需要通过数据库查询来对⽐验证。接下来进⾏读取数据库的验证⽅式:分为三步:1.获取⽤户信息 2.校验⽤户 3.密码加密
⾸先在service包中新建MyUserDetailsService 类并实现UserDetailsService 接⼝,实现⽅法loadUserByUsername(String username),这个⽅法返回的UserDetails就是⽤户信息的载体,⽅法⼊参为⽤户名。
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return null;
}
}
继续添加⽅法内容,从数据库根据⽤户名查密码的代码就省略,这⾥直接写死123456,权限集合为admin(这⾥的密码和权限是要从数据库获取的,这⾥为了讲解就忽略),再添加上@Component注解,将MyUserDetailsService 注⼊到spring容器中。
@Component
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//这⾥的代码最后需要返回security包的User类型,这⾥的密码和权限需要数据库读取的,忽略
return new User(username,"123456",AuthorityUtilsmaSeparatedStringToAuthorityList("admin"));
}
}
再次启动后,将不会在控制台出现随机密码。因为这⾥变成了⾃定义⽤户了,需要读取数据库,如果⽤户名不存在,return
null,UserDetails 还有很多构造⽅法,⼊参带有是否⽆效⽤户,是否被锁定,过期等等。。。
这⾥⽤户构造⽅法,其实是默认这些都是true
5.⾃定义登录页⾯
⾃定义页⾯需要以下步骤:在 MySecurityConfig 类中的⽅法修改如下的配置信息,然后指定的页⾯需要请求到固定的url并带上强制要求的参数名,才能正确请求到spring security的中使其⽣效。
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/user/login","/css/**","/images/**","/jquery/**","/layui/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()//通过表单验证⽅式
//指定登录页的路径
.loginPage("/user/login")
//指定⾃定义form表单请求的路径
.loginProcessingUrl("/authentication/form")
.
failureUrl("/login?error")
.defaultSuccessUrl("/home/test")
//必须允许所有⽤户访问我们的登录页(例如未验证的⽤户,否则验证流程就会进⼊死循环)
//这个formLogin().permitAll()⽅法允许所有⽤户基于表单登录访问/login这个page。
.permitAll();
//默认都会产⽣⼀个hiden标签⾥⾯有安全相关的验证防⽌请求伪造这边我们暂时不需要可禁⽤掉
http.csrf().disable();
}
}
6.密码加密
⾸先注⼊PasswordEncoder 在MySecurityConfig 类中,这样登录页⾯输⼊的密码就会通过这个BCryptPasswordEncoder进⾏加密后才进⾏对⽐。
@Bean
public PasswordEncoder create(){
return new BCryptPasswordEncoder();
}
如果后台获取的明⽂密码的话,那也需要做加密,这⾥贴出代码
@Component
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
String password = "123456";
password = de(password);//进⾏加密,这⾥加密后,就跟前台加密后的⼀致了
return new User(username,password,AuthorityUtilsmaSeparatedStringToAuthorityList("admin"));
}
}
7.Thymleaf获取⽤户信息
当后台能够通过验证⾝份后,可以访问到页⾯,页⾯需要相关的权限读取和⽤户信息读取,如果在后台需要读取⽤户信息,可以通过下⾯的代码:
UserDetails userDetails = (UserDetails) Context()
接下来进⼊正题,实现页⾯获取⽤户信息,添加依赖包,注意版本不匹配可能会导致读取不到,所以这⾥使⽤默认版本
<dependency>
<groupId>as</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
页⾯引⼊约束:
<html lang="zh-CN" xmlns:th="" xmlns:sec="/thymeleaf-extras-springsecurity4">
显⽰的地⽅标签内引⼊sec属性:(sec:authentication="name"获取⽤户名,其他标签请百度)
<a href="javascript:;">
<img src="t/RCzsdCq" class="layui-nav-img">
<span sec:authentication="name"></span>
</a>
注意:在页⾯的开发中,security会有对于iframe的安全配置,导致⽆法显⽰,需要在配置中添加 .headers().frameOptions().disable(),否则页⾯出现错误:
Refused to display ‘localhost:8080/**’ in a frame because it set ‘X-Frame-Options’ to ‘deny’.
退出功能实现
⽤户退出登录实质是使当前登录⽤户的session失效的操作。⼀般来说,⽤户退出后,将会被重定向到站点的⾮安全保护页,⽐如登录页⾯,创建⼀个退出请求logout,并在代码中实现logout
@RequestMapping(value="/logout", method = RequestMethod.GET)
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
Authentication auth = Context().getAuthentication();
if (auth != null){
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return "redirect:/user/login?logout";
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论