SpringBoot+SpringSecurity快速入门

向右看齐 2023-10-15 08:06 185阅读 0赞

目录

简介

快速开始

二、基于管理员模块SpringSecurity快速开始

2.0、首先引入依赖

2.1、继承WebSecurityConfiuraerAdapter

2.2、前端页面

三、基于普通用户模块SpringSecurity快速开始

3.0、引入依赖

3.1、实现 UserDetaiilsService接口

3.2、继承WebSecurityconfiuraerAdapter

3.3、前端页面


简介

在SpringBoot 2.3.4.RELEASE中集成了SpringSecurity,所以我们只需要引入启动依赖即可。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的

成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方

案。

正如你可能知道的关于安全方面的两个主要区域是“ 认证 ”和“ 授权 ”(或者访问控

制),一般来说,Web 应用的安全性包括 用户认证(Authentication)和用户授权

(Authorization) 两个部分,这两点也是 Spring Security 重要核心功能。

(1)用户认证指的是:验证某个用户是否为系统中的合法主体,也就是说用户能否访问

该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认

证过程。 通俗点说就是系统认为用户是否能登录

(2)用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户

所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以

进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的

权限。 通俗点讲就是系统判断用户是否有权限去做某些事情

快速开始

使用SpringSecurity的快速开始分为两步讲解,因为在公司写项目的过程中,分为前台和后台,而在后台使用登录时,是不需要查询数据库的,因为后台登录是管理员控制,而管理员只需要1~5个即可。在前台我们就需要查询数据库了,所以我将快速开始分为两个模块,一个为后台模块,一个为前台模块

二、基于管理员模块SpringSecurity快速开始

2.0、首先引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

2.1、继承WebSecurityConfiuraerAdapter

  1. WebSecurityConfigurerAdapter
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. @Override
  5. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  6. String password = passwordEncoder().encode("密码");
  7. auth.inMemoryAuthentication().withUser("账号").password(password).roles("");
  8. }
  9. //引入security自带的密码加密
  10. @Bean
  11. PasswordEncoder passwordEncoder(){
  12. return new BCryptPasswordEncoder();
  13. }
  14. @Override
  15. protected void configure(HttpSecurity http) throws Exception {
  16. //配置认证
  17. http.formLogin().loginPage("/login.html")//配置那个url为登录页面
  18. .loginProcessingUrl("/login")//设置那个是登录的url
  19. .defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
  20. .failureForwardUrl("/find.html").permitAll()//登录失败去哪?
  21. //退出时删除缓存,并且重定向到login.html页面 在前端默认路径为:/logout .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
  22. //开启frame功能
  23. http.headers().frameOptions().sameOrigin();
  24. //这个可以根据自己需求去添加
  25. http.authorizeRequests().antMatchers(
  26. "/css/**",
  27. "/*.html",
  28. "/img/**",
  29. "/js/**",
  30. "/login",
  31. "/plugins/**"
  32. ).permitAll()//制定URL无需保护。
  33. .anyRequest() //其他请求
  34. .authenticated();//需要认证
  35. //关闭csrf跨域
  36. http.csrf().disable();
  37. }
  38. }

2.2、前端页面

  1. <form action="/login"method="post">
  2. 用户名:<input type="text"name="username"/><br/>
  3. 密码:<input type="password"name="password"/><br/>
  4. <input type="submit"value="提交"/>
  5. </form>

注意:name必须叫:**username **password method必须为**post提交 action为:/login**

配置完成之后就可以启动项目开始测试了,不管访问什么都会默认到你指定的登录页面,只有登录成功之后才可以访问其他页面!

三、基于普通用户模块SpringSecurity快速开始

3.0、引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>

3.1、实现 UserDetaiilsService接口

  1. @Service("userDetailsService")
  2. public class MyUserDetailsService implements UserDetailsService {
  3. /**
  4. 因为公司项目使用的是Dubbo+zookeeper组合,所以我调用的接口在zookeeper中使用这个注解
  5. 如果你使用的是单项目的话可以直接通过spring注入的方式,来获取你的mapper接口!
  6. */
  7. @Reference(version = "1.0.0")
  8. SellerService sellerService;
  9. @Override
  10. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  11. //给当前用户创建权限 可自定义 默认就为这个
  12. List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_SELLER");
  13. //通过前端传入的参数获取username,在数据库中查询出来数据
  14. Seller seller = sellerService.findOne(username);
  15. //这个是判断用户的状态,如果没有状态,你只需要判断是否为空即可
  16. if (seller!=null && "1".equals(seller.getStatus())){
  17. return new User(seller.getSellerId(),new BCryptPasswordEncoder().encode(seller.getPassword()),auths);
  18. }else {
  19. throw new UsernameNotFoundException("用户名不存在");
  20. }
  21. }
  22. }

3.2、继承WebSecurityconfiuraerAdapter

  1. @EnableWebSecurity
  2. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  3. @Autowired
  4. UserDetailsService userDetailsService;
  5. @Override
  6. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  7. //通过数据库查询出来判断账号密码是否相等
  8. auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
  9. }
  10. //注入security自带的加密方式
  11. @Bean
  12. PasswordEncoder passwordEncoder(){
  13. return new BCryptPasswordEncoder();
  14. }
  15. @Override
  16. protected void configure(HttpSecurity http) throws Exception {
  17. //配置认证
  18. http.formLogin().loginPage("/shoplogin.html")//配置那个url为登录页面
  19. .loginProcessingUrl("/login")//设置那个是登录的url
  20. .defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
  21. .failureForwardUrl("/shoplogin.html").permitAll()//登录失败去哪?
  22. .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
  23. // 解析前端的 <frame>、<iframe> 标签
  24. http.headers().frameOptions().sameOrigin();
  25. //设置无需保护的路径
  26. http.authorizeRequests().antMatchers(
  27. "/css/**",
  28. "/img/**",
  29. "/js/**",
  30. "/login",
  31. "/plugins/**",
  32. "/seller/addSeller",
  33. "/*.html"
  34. ).permitAll()//制定URL无需保护。
  35. .anyRequest() //其他请求
  36. .authenticated();//需要认证
  37. //关闭跨域
  38. http.csrf().disable();
  39. }
  40. }

此图片就是上边代码中的内容,可以忽略

98fd74a61fc64f47a73a487a1d465738.png

3.3、前端页面

  1. <form action="/login"method="post">
  2. 用户名:<input type="text"name="username"/><br/>
  3. 密码:<input type="password"name="password"/><br/>
  4. <input type="submit"value="提交"/>
  5. </form>

3.4、获取被Security管理的用户名

  1. @RequestMapping("/name")
  2. public Map<String,String> name(){
  3. //获取被Security管理的username
  4. String name= SecurityContextHolder.getContext().getAuthentication().getName();
  5. //将他保存到map等其他类型中就可以传到前端页面或者通过这个名字查询数据库
  6. Map<String, String> map = new HashMap<>();
  7. map.put("loginName",name);
  8. return map;
  9. }

可以进行测试啦

请求链:

当我们启动项目的时候会自动加载3.2中的 configure(HttpSecurity http)方法,然后当我们进入登录页,通过username,password提交post请求数据到/login时,会进入3.1中loadUserByUsername(String username)方法,来进行你数据库之间的判断,判断结束后会进入3.2中的configure(AuthenticationManagerBuilder auth) 方法,交给Security处理是否登录成功

发表评论

表情:
评论列表 (有 0 条评论,185人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DataBinding快速入门

    一、DataBinding介绍 DataBinding翻译过来就是数据绑定,把数据绑定在控件上。本篇讲述的都是单向绑定,即数据绑定到控件上。现在已经支持双向绑定,也就是说