1.创建springBoot项目
添加springframework资源
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
由于jdk版本是1.8的所以需要把java.version更改,更改java1.8的后springboot就要改成2.几的,3.几的是java11以上用的
1.2创建第一个测试资源项目
启动启动类后进入Hello页面会跳转到login
默认name是user,password在后台
2. 自定义账户和密码
我们刚才使用的是security自带的账户和密码。 我们也可以自己定义账户和密码。
2.1 在application.properties中定义
# 自定义security的账户和密码--不会帮你生成密码了 spring.security.user.name=admin spring.security.user.password=123456
注意: 这种方式只能定义一个账户和密码。
2.2 自定义多个账户和密码
配置类基础extends WebSecurityConfigurerAdapter然后重写configure(AuthenticationManagerBuilder auth)
在配置文件中,只能定义一个账户和密码。 我们可以定义一个配置类,完成多个账户和密码的定义。
@Configuration public class MySecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() //基于内存创建的账户 未来我们可以基于数据库 .withUser("zhangsan") //账号名 .password("123456") //密码 .roles("admin") //具有的角色 .and() //连接符 .withUser("lisi") .password("123456") .roles("test") ; } }
如果使用了配置类,那么原来在配置文件中自定义的账户和密码就不会
需要指定它的密码加密器。
3. 密码加密器
可以把明文转化为密文 encode, 同时可以进行密码的匹配。matches
public static void main(String[] args) { //创建了密码加密器 PasswordEncoder passwordEncoder=new BCryptPasswordEncoder(); //加密功能 String encode = passwordEncoder.encode("123456"); //把明文加密后生成了密文。 //密码匹配 第一个参数: 客户输入的明文 第二个参数: 数据库中存在的密文 boolean matches = passwordEncoder.matches("1234567", encode); System.out.println(matches); }
对称加密 和 非对称加密
对称加密 加密和解密使用的密钥都是同一个。 --可以破解。
非对称加密: 加密和解密使用的密钥不是同一个。---无法破解。MD5加密 SH512加密
4. 获取当前用户的信息
当前登录成功者的信息。
思考: 从session中获取。setAttribute(key,value); getAttribute(key);
security默认把当前用户信息保存SecurityContext对象中
@GetMapping("/info") public Authentication info(){ //把当前用户信息保存在SecurityContext类中。 SecurityContext securityContext = SecurityContextHolder.getContext(); //把当前用户信息封装到Authentication类中。账户 密码 权限 角色等信息 Authentication authentication = securityContext.getAuthentication(); return authentication; }
security框架会把当前用户信息封装到Authentication中,并把该类对象存放到SecurityContext中。
5. 修改security的默认配置
5.1 修改它的登录页面
默认security提供了一个登录页面, 如果不想使用它提供的页面,我们可以指定我们自己的登录页面。
1.自己在static目录下创建一个登录页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--注意: 提交路径action必须为login 提交方式必须为post. input的名称必须为username和password --> <form action="/login" method="post"> 账户:<input type="text" name="username"/><br> 密码:<input type="password" name="password"/><br> <input type="submit"/> </form> </body> </html>
2.修改Security配置类
@Override protected void configure(HttpSecurity http) throws Exception { //设置表单登录信息 http.formLogin() .loginPage("/login.html") //设置自己的登录界面 //.usernameParameter("name") //设置表单的账户名称 默认为usernae .permitAll(); //允许放行 //禁用跨域伪造请求的验证 http.csrf().disable(); //其他请求路径都要认证 http.authorizeRequests().anyRequest().authenticated(); }
5.2 设置登录成功跳转的页面
默认登录成功跳转 / 或原来的访问路径。
1.修改security配置类、
2.创建SuccessController类
@Controller public class SuccessController { @PostMapping("/success") public String success(){ return "redirect:/success.html"; } }
3.创建成功页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 登录成功 </body> </html>
登录失败指定跳转路径
.failureUrl("/failureurl.html")