SpringBoot 整合Security权限控制的初步配置

yizhihongxing

下面就来为大家详细讲解 SpringBoot 整合 Security 权限控制的初步配置。

1. 引入依赖

首先,在项目的 pom.xml 文件中,我们需要引入 Spring Security 的依赖,具体代码如下:

<!-- Spring Security -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 添加配置类

完成依赖的引入后,我们需要添加一个配置类,用于配置我们的 Security 策略。下面是一个示例代码:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private LogoutSuccessHandler logoutSuccessHandler;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password(passwordEncoder().encode("123456")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder().encode("admin123")).roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/login")
                .defaultSuccessURL("/")
                .failureUrl("/login?error")
                .permitAll()
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(logoutSuccessHandler)
                .permitAll()
                .and()
                .csrf().disable();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

在这个配置类中,我们分别实现了两个方法:

  • configure(AuthenticationManagerBuilder auth):这个方法用于配置用户信息,包括用户名、密码和角色等信息。在示例代码中,我们采用了基于内存的方式配置用户信息。

  • configure(HttpSecurity http):这个方法用于配置访问控制规则。在示例代码中,我们配置了不同角色用户访问不同的 URL 权限,同时定制了登录页面、成功跳转页面和退出登录 URL 等信息。

3. 自定义 LogoutSuccessHandler

在我们的配置类中,我们还注入了一个 LogoutSuccessHandler 实例,用于处理退出登录成功后的逻辑,例如重定向到登录页或者首页等。

我们需要自定义 LogoutSuccessHandler,示例代码如下:

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        response.sendRedirect("/login");
    }
}

4. 添加登录页面

最后,我们需要添加一个登录页面,示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form action="/login" method="post">
    <div>
        <label>Username:</label>
        <input type="text" name="username">
    </div>
    <div>
        <label>Password:</label>
        <input type="password" name="password">
    </div>
    <input type="submit" value="Login">
</form>
</body>
</html>

注意,这里的表单 action 值需要与配置类中的登录路径一致。

示例一:管理员和用户分别访问不同的 URL

我们设置了管理员和普通用户分别可以访问不同的 URL:

  • 管理员访问 /admin/** 所有资源路径时需要 ADMIN 角色。

  • 用户访问 /user/** 所有资源路径时需要 USER 角色。

下面是示例代码:

@GetMapping("/admin/hello")
@PreAuthorize("hasRole('ADMIN')")
public String adminHello() {
    return "hello, admin!";
}

@GetMapping("/user/hello")
@PreAuthorize("hasRole('USER')")
public String userHello() {
    return "hello, user!";
}

示例二:退出登录

我们配置了退出登录后跳转到登录页面:

.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(logoutSuccessHandler)
.permitAll()

并且实现了自定义的 LogoutSuccessHandler:

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        response.sendRedirect("/login");
    }
}

以上就是 SpringBoot 整合 Security 权限控制的初步配置攻略,希望能对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 整合Security权限控制的初步配置 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java日常练习题,每天进步一点点(3)

    让我来详细讲解“Java日常练习题,每天进步一点点(3)”的完整攻略。 1. 理解练习题的目的和基本要求 练习题的目的是帮助Java初学者提高编程能力,掌握常用的语法和数据结构。基本要求是: 按顺序完成每一个练习; 尽可能自己编写代码,不要复制粘贴; 根据题目要求输出正确的结果; 动手实践,理解代码背后的逻辑思维。 2. 学习Java的基础知识 在进行练习之…

    Java 2023年6月15日
    00
  • 基于maven使用IDEA创建多模块项目

    下面是基于maven使用IDEA创建多模块项目的完整攻略。 1. 创建父项目 打开IDEA,选择File -> New -> Project。 在左侧栏选择Maven,并且在右侧方框中勾选Create from archetype选项。 在弹出的对话框中选择maven-archetype-quickstart,并点击Next。 填写GroupId…

    Java 2023年5月19日
    00
  • SpringBoot实现WEB的常用功能案例详解

    Spring Boot是一个快速构建应用程序的框架,它提供了许多常用的Web功能,如路由、过滤器、拦截器、异常处理等。以下是Spring Boot实现Web的常用功能的完整攻略: 路由 路由是Web应用程序中的一个重要功能,它可以将请求映射到相应的处理程序。在Spring Boot中,我们可以使用@Controller和@RequestMapping注解来定…

    Java 2023年5月15日
    00
  • 必须要学会的JMM与volatile

    下面我为你详细讲解必须要学会的JMM与volatile的完整攻略。 JMM介绍 JMM(Java Memory Model)即Java内存模型,用于规范Java程序中线程对共享变量的操作。JMM为Java程序中的线程提供可见性、有序性、原子性等保证,从而提高程序并发性能。 JMM提供的保证 可见性: 一个线程修改了共享变量的值,这个值的变化对其他线程是可见的…

    Java 2023年5月26日
    00
  • java8新特性教程之time包使用总结

    Java8新特性教程之time包使用总结 Java8引入了java.time包,为Java的日期和时间处理提供了全新的API。新的API包括了很多改进和新增的功能,例如: 新的日期和时间API更加安全; 新的日期和时间API更加简单,提升了开发效率; 新的日期和时间API实现了时区处理,并且更加清晰易懂; 新的日期和时间API提供了可读性更强的代码。 Jav…

    Java 2023年5月20日
    00
  • Java CAS基本实现原理代码实例解析

    下面将为你讲解“Java CAS基本实现原理代码实例解析”的完整攻略。 什么是Java CAS Java CAS是指Java中的“Compare and Swap”(比较和交换)机制,它是实现多线程同步的经典算法。使用CAS,我们可以在不锁定的情况下实现对内存中的变量原子操作,从而为多线程的并发访问提供了保障。 Java CAS实现原理 Java CAS的基…

    Java 2023年5月18日
    00
  • SharePoint 2007图文开发教程(5) 体验Event Handler

    SharePoint 2007图文开发教程(5) 体验Event Handler 什么是Event Handler? Event Handler是指一种事件处理程序,常用于在数据更新、插入或删除等操作的过程中执行特定的操作,例如发送邮件通知、记录日志等。在SharePoint中,Event Handler被广泛应用于对列表、文档库等对象的事件进行处理。 如何…

    Java 2023年5月31日
    00
  • Java中四种线程池的使用示例详解

    Java中四种线程池的使用示例详解 前言 线程池可以实现线程的复用, 表示为一个线程池中的线程可以多次使用, 而不是单个线程只能被使用一次。Java中的线程池主要有四种, 分别是固定线程数线程池、可缓存的线程池、单线程化线程池和定时器线程池。接下来我们将介绍这四种线程池的使用详细攻略。 一、固定线程数线程池 固定线程数线程池,顾名思义,就是只有固定数量的线程…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部