SpringSecurity的入门使用
SpringSecurity简介
secruity的最核心内容:
认证 (你是谁)
授权 (你能干什么)
攻击防护 (防止伪造身份)
SpringSecurity入门配置
首先新建SpringBoot项目,在其中导入依赖:
下面展示一些 内联代码片
。
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
导入后,我们需要小小的配置一下:
新建包:config
config包下新建SecurityConfig类,继承WebSecurityConfigurerAdapter类:
在该类中写入下列内容:
@Bean
public PasswordEncoder getPasswordEncoder(){
return new BCryptPasswordEncoder();
}
如此,Security的入门配置就好了,这样配置后,我们输入自己的ip及端口,我们能进入Security的内置登陆页面以及登陆逻辑:
登录名是user
密码在控制台中生成
SpringSecurity配置自定义登陆页面
首先写好登陆页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<input type="text" placeholder="用户名" name="username"><br>
<input type="text" placeholder="密码" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
记住,登陆方式必须选post,不能选get
之后,在config类中重写config方法:
http.formLogin()
//选择静态资源html登陆界面
.loginPage("/login.html")
//与表单的请求接口一样
.loginProcessingUrl("/login")
//post请求
//.successForwardUrl("/loginSuccess")
//登陆成功重定向到百度
.successHandler(new MyAnthenticationSuccessHandler("http://www.baidu.com"))
//.failureForwardUrl("/loginFail");
//登陆失败重定向到youtube
.failureHandler(new MyAnthenticationSuccessHandler("https://www.youtube.com"));
各个方法的用处我已经写在了注释上。
注意!!!
我现在使用重定向方法是能够使得程序在登陆成功或者失败后能去访问其他web资源,而不是只能访问自己项目中的静态页面。
如果要访问自己的静态页面可以使用//.successForwardUrl("/loginSuccess")这个方法。
除此以外,在自定义登陆界面后我们其实并不能访问到我们的自己写的html页面,因为我们没有“放行”,因为Security是只能使用它自己的登陆逻辑,登陆页面,我们自定义登陆页面的话,必须配置,使security放行。
即,在config类中写入以下代码:
http.authorizeRequests()
//放行login
.antMatchers("/login.html")
.permitAll()
.antMatchers("/loginerror.html")
.permitAll()
//所有请求必须验证
.antMatchers("/image/**")
.permitAll()
//拒绝所有请求
.anyRequest().authenticated();
注意逻辑,.anyRequest().authenticated();是指拒绝所有请求,所以必须放在最下面,如果放在上面,那么所有请求都会被拒绝!!!!
还有注意一点,必须还要再config类中加上这一句话:
//关闭csrf
http.csrf().disable();
类似于关闭防火墙,不关闭的话,我们还是没法儿访问。
终于,搞完了这些,我们终于能够访问自己的登陆界面了:
输入localhost:8080
此时,输入用户名和密码即可登陆。注意,上文说的重定向先暂时别用,把它注释掉,用.successForwardUrl("/loginSuccess"),这个/loginSuccess是你自己定义的接口url。
SpringSecurity配置自登录逻辑
经历了刚刚的自定义页面,我们现在需要自定义逻辑,刚刚上文这样只是自定义了界面,但是内在逻辑还是框架自带的,密码,用户名也是框架给你定的,我们这时候需要使用自己从数据库中的用户名密码,就要自定义逻辑。
在service层新建一个类,实现UserDetailsService接口。
重写loadUserByUsername方法:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if(!"admin".equals(username)){
throw new UsernameNotFoundException("用户不存在");
}
String password = passwordEncoder.encode("1234");
return new User(username,password, AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal"));
}
注意,这里的username是用户提交的,admin是我们从数据库查出来的,因为这里不讲mybatis等框架,所以就简单点。
password这个变量,是从数据库查出来的,这里encode就是对其进行编码,
String password = passwordEncoder.encode(“1234”);
这句话需要理解,其中“1234”是我们从数据库中的密码,但是一般来说,数据库中密码一般都是密文,所以查出来时它一般是加密的,所以,我们需要对其加密。
所以这一句代码的意思是:我们根据用户名username查询到了password,password的明文是“1234”,密文是对其进行encode。
之后我们把username和password以及权限都给User类,即可完成自定义登陆逻辑。
注意 User类是指:
import org.springframework.security.core.userdetails.User;
这个User类。
不是你自己定义的User类。
这里可能有人会问,你的判断逻辑呢?
用户输入的密码,是如何与你查询出来的password密文比较的呢?
这个你就不用管了,User中自己会判断。