• Spring Boot、Spring Security登录认证及权限问题



    目录

    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    Ⅱ. XxxApplication启动类

    Ⅲ. 在application.yml文件中自定义

    Ⅳ.启动项目

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    Ⅱ. application.yml文件

    Ⅲ. bean包的操作

    Ⅳ. service层

    Ⅴ.config配置类 

    Ⅵ.启动项目

    二、权限问题

    1.config类

    2.bean包

    3.service层

    4.启动项目


    一、登录验证

    1.自定义密码账号

    Ⅰ.引入依赖

    先搭建好一个SpringBoot框架,在基础上引入依赖

    1. <!--web-->
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter-web</artifactId>
    5. <version>2.7.1</version>
    6. </dependency>
    7. <!--小辣椒-->
    8. <dependency>
    9. <groupId>org.projectlombok</groupId>
    10. <artifactId>lombok</artifactId>
    11. <version>1.18.24</version>
    12. </dependency>
    13. <!--spring security-->
    14. <dependency>
    15. <groupId>org.springframework.boot</groupId>
    16. <artifactId>spring-boot-starter-security</artifactId>
    17. </dependency>

    Ⅱ. XxxApplication启动类

    1. @SpringBootApplication
    2. public class DemoApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(DemoApplication.class,args);
    5. }
    6. }

    Ⅲ. 在application.yml文件中自定义

    1. spring:
    2. security:
    3. user:
    4. name: porsche
    5. password: 911

    Ⅳ.启动项目

    运行项目,在网页中输入账号密码。

    2.从数据库中查找账号和密码 

    Ⅰ.引入依赖

    1. <!--mysql连接-->
    2. <dependency>
    3. <groupId>mysql</groupId>
    4. <artifactId>mysql-connector-java</artifactId>
    5. </dependency>
    6. <!--mybatis plus-->
    7. <dependency>
    8. <groupId>com.baomidou</groupId>
    9. <artifactId>mybatis-plus-boot-starter</artifactId>
    10. <version>3.5.1</version>
    11. </dependency>
    12. <!--druid-->
    13. <dependency>
    14. <groupId>com.alibaba</groupId>
    15. <artifactId>druid-spring-boot-starter</artifactId>
    16. <version>1.2.9</version>
    17. </dependency>

    Ⅱ. application.yml文件

    1. server:
    2. port: 8080
    3. spring:
    4. datasource:
    5. driver-class-name: com.mysql.cj.jdbc.Driver
    6. username: bjwl
    7. password: bjwl
    8. url: jdbc:mysql://192.168.1.118:3306/book_store?serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    9. type: com.alibaba.druid.pool.DruidDataSource
    10. mybatis-plus:
    11. configuration:
    12. map-underscore-to-camel-case: false
    13. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

    Ⅲ. bean包的操作

    实体类:

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @TableName("user")
    5. public class Users implements Serializable {
    6. private Integer id;
    7. private String userName;
    8. private String passWord;
    9. private String nickName;
    10. private Integer state;
    11. }

    LoginUsers类:

    1. @AllArgsConstructor
    2. @NoArgsConstructor
    3. public class LoginUsers implements UserDetails {
    4. private Users users;
    5. //返回当前用户的所有权限
    6. public Collection<? extends GrantedAuthority> getAuthorities() {
    7. return users.getList();
    8. }
    9. //返回密码
    10. public String getPassword() {
    11. return users.getPassWord();
    12. }
    13. //返回用户名
    14. public String getUsername() {
    15. return users.getUserName();
    16. }
    17. @Override
    18. public boolean isAccountNonExpired() {
    19. return true;
    20. }
    21. @Override
    22. public boolean isAccountNonLocked() {
    23. return true;
    24. }
    25. @Override
    26. public boolean isCredentialsNonExpired() {
    27. return true;
    28. }
    29. @Override
    30. public boolean isEnabled() {
    31. return true;
    32. }
    33. }

    Ⅳ. service层

    1. // 是SpringSecurity的业务类,负责实现认证和授权
    2. @Service
    3. public class UsersService implements UserDetailsService {
    4. @Resource
    5. private UsersMapper mapper;
    6. @Override
    7. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    8. QueryWrapper<Users> wrapper = new QueryWrapper<>();
    9. wrapper.eq("username", username);
    10. Users users = mapper.selectOne(wrapper);//查询一条记录
    11. if (Objects.isNull(users)) {
    12. throw new RuntimeException("用户名没有找到");
    13. }
    14. return new LoginUsers(users);
    15. }
    16. }

    Ⅴ.config配置类 

    1. /*
    2. 它是SpringSecurity的配置类
    3. */
    4. @Configuration
    5. public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    6. @Resource
    7. private UsersService usersService;
    8. @Bean
    9. public PasswordEncoder getPasswordEncoder() {
    10. return new BCryptPasswordEncoder();
    11. }
    12. //数据库的认证
    13. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    14. auth.userDetailsService(usersService).passwordEncoder(getPasswordEncoder());
    15. }
    16. }

    Ⅵ.启动项目

     此时后台也会显示出,在数据库中查询了一次

    二、权限问题

    1.config类

    在类中设置权限,和设置权限名,给1.html只开启了abc01的权限,给2.html开启了abc01和abc02的权限。

    也就是说abc01可以访问1.html和2.html,abc02只可以访问2.html

    1. protected void configure(HttpSecurity http) throws Exception {
    2. http.formLogin()
    3. .loginPage("/login.html") //登录页面设置
    4. .loginProcessingUrl("/a/lo") //登录访问路径 这里同 login.html中的action
    5. .permitAll()
    6. .and().exceptionHandling().accessDeniedPage("/403.html")
    7. .and().authorizeRequests()
    8. .antMatchers("/login.html", "/a/lo").permitAll() //设置哪些路径可以直接访问,不需要认证
    9. .antMatchers("/1.html").hasAuthority("adc01") //设置当前网页访问权限
    10. .antMatchers("/2.html").hasAnyAuthority("abc01","abc02")
    11. .anyRequest().authenticated() //所有请求都可以访问
    12. .and().csrf().disable(); //关闭csrf,csrf:跨站请求伪造
    13. }

    2.bean包

    在实体类中加入

    1. @TableField(exist = false)
    2. private List<GrantedAuthority> list;

    3.service层

    为用户设置权限名

    1. List<GrantedAuthority> list = new ArrayList<>();
    2. list.add(new SimpleGrantedAuthority("abc02"));
    3. users.setList(list);

    4.启动项目

    登录

    访问1.html

    访问2.html

     


  • 相关阅读:
    【Android 四大组件之Service】一文吃透Service 服务
    九、iOS原生应用(宿主App)与uni小程序间的通讯
    javaweb--Tomcat
    python学习笔记(06)---(内置容器-元组)
    计算机视觉:人脸识别与检测
    斐波那契数列Kotlin的N种实现方式
    数学建模--优化类模型
    基于数据驱动的变电站巡检机器人自抗扰控制
    微信开发者工具 / 反编译工具CrackMinApp 下载安装
    如何快速选购腾讯云NVIDIA GPU云服务器实例?
  • 原文地址:https://blog.csdn.net/weixin_55166132/article/details/125509739