SpringBoot Security安装配置及Thymeleaf整合

下面我将为你详细讲解“SpringBoot Security安装配置及Thymeleaf整合”的完整攻略。

安装

首先需要在pom.xml中添加依赖:

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

配置

添加完依赖之后,需要在Spring Boot应用程序上启用安全性。对于这个任务,我们需要编写一个配置类,并使用@EnableWebSecurity注释激活Spring Security的Web安全性功能:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }

}

在上面的代码中,我们声明了一个WebSecurityConfig类并扩展了WebSecurityConfigurerAdapter类。我们还使用@EnableWebSecurity注释将启用Web安全性,并在configure()方法中配置HttpSecurity以定义我们的安全性规则。在configureGlobal()方法中,我们将用户的认证委托给UserService。

Thymeleaf整合

Thymeleaf是一种针对网站和Java应用程序的先进的Web和模板引擎。为了将Thymeleaf与Spring Security整合,我们需要添加一个Thymeleaf安全Dialect。这是通过在pom.xml上添加以下依赖来完成的:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
    <version>3.0.4.RELEASE</version>
</dependency>

此外,在Spring Boot应用程序上配置Thymeleaf模板解析器时,我们需要添加一个安全方言:

@Configuration
public class ThymeleafConfig implements WebMvcConfigurer {

    private final ApplicationContext applicationContext;

    public ThymeleafConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        engine.setTemplateResolver(templateResolver());
        engine.addDialect(new SpringSecurityDialect());
        return engine;
    }

    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        registry.viewResolver(resolver);
    }
}

示例

接下来,我将使用两个示例来说明SpringBoot Security安装配置及Thymeleaf整合。

示例1:基本认证

首先定义一个UserController类,其中包含了一个login()方法和一个logout()方法:

@Controller
public class UserController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @GetMapping("/logout")
    public String logout() {
        return "redirect:/login?logout=true";
    }

}

然后,我们需要创建一个login.html模板来显示登录页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-md-4 col-md-offset-4">
                <h1>Login</h1>
                <form th:action="@{/login}" method="post">
                    <div class="form-group">
                        <label for="username">Username</label>
                        <input type="text" class="form-control" id="username" name="username" placeholder="Enter username">
                    </div>
                    <div class="form-group">
                        <label for="password">Password</label>
                        <input type="password" class="form-control" id="password" name="password" placeholder="Enter password">
                    </div>
                    <button type="submit" class="btn btn-default">Submit</button>
                </form>
            </div>
        </div>
    </div>
</body>
</html>

为了测试我们的代码,我们需要创建一个安全配置类和一个用户服务类:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

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

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

}

@Service
public class UserService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (username.equals("user")) {
            return User.withUsername("user")
                       .password(passwordEncoder().encode("password"))
                       .roles("USER")
                       .build();
        } else {
            throw new UsernameNotFoundException("User not found.");
        }
    }

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

}

示例2:自定义登录认证

首先定义一个CustomUserDetails类来扩展Spring Security的UserDetails接口:

public class CustomUserDetails implements UserDetails {

    private final String username;
    private final String password;
    private final Collection<? extends GrantedAuthority> authorities;

    public CustomUserDetails(String username, String password,
            Collection<? extends GrantedAuthority> authorities) {
        this.username = username;
        this.password = password;
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

}

然后我们需要扩展UserDetailsService接口,并在其中进行自定义的用户认证:

@Service
public class UserService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if (username.equals("user")) {
            List<GrantedAuthority> authorities = new ArrayList<>();
            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
            return new CustomUserDetails("user", passwordEncoder().encode("password"), authorities);
        } else {
            throw new UsernameNotFoundException("User not found.");
        }
    }

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

}

最后,在WebSecurityConfig类中,我们需要使用自定义的UserDetailsService,并对我们的用户名和密码进行验证:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService);
    }

}

这两个示例可以帮助你理解SpringBoot Security安装配置及Thymeleaf整合的过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot Security安装配置及Thymeleaf整合 - Python技术站

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

相关文章

  • JSP页面上用下横线代替文本框效果的代码

    下横线代替文本框是一种简单的表单样式,可以在JSP页面上实现。下面是实现的步骤: 第一步:创建form表单 在JSP页面中,首先需要创建一个form表单,代码如下所示: <form action="submit.jsp" method="post"> 注意,在form标签中,我们指定了表单的提交方式为POS…

    Java 2023年6月15日
    00
  • 如何用注解的方式实现Mybatis插入数据时返回自增的主键Id

    下面详细讲解如何用注解的方式实现Mybatis插入数据时返回自增的主键Id。 首先,在处理插入操作时,通常需要获取数据库自动生成的主键Id,以便后续处理。使用Mybatis时,可以使用useGeneratedKeys和keyProperty两个属性来实现此功能。 其中,useGeneratedKeys表示是否使用数据库自动生成的主键,默认值是false;而k…

    Java 2023年5月20日
    00
  • Spring Data JPA实现持久化存储数据到数据库的示例代码

    以下是详细的攻略: 一、什么是Spring Data JPA Spring Data JPA是Spring框架中对JPA(Java Persistence API)规范的封装。JPA是一种ORM(Object Relational Mapping)框架,用于将Java对象映射到关系型数据库。 Spring Data JPA对JPA的封装简化了数据访问层的开发…

    Java 2023年5月20日
    00
  • Java内存模型的作用是什么?

    Java内存模型定义了Java程序中不同线程的内存访问行为和相互作用。它的作用是确保线程之间的可见性、原子性和有序性,提供一种可靠的线程同步机制。 在Java程序中,内存访问操作被划分为读操作和写操作。Java内存模型通过定义一系列规则来约束这些操作,确保它们在多线程环境下的顺序和可见性。以下是Java内存模型的重要特性: 原子性:对于单个的变量读/写具有原…

    Java 2023年5月11日
    00
  • Java获取文件的类型和扩展名的实现方法

    获取文件类型和扩展名是Java中经常用到的功能之一。下面将详细讲解Java获取文件类型和扩展名的实现方法。 获取文件扩展名 方法一:使用String类的substring()函数 Java中的String类拥有很多有用的函数,例如substring()函数可以截取一个字符串的一部分。通过substring函数,我们可以将文件名中最后一个点号(.)后面的字符(…

    Java 2023年5月20日
    00
  • 什么是Java Attach API?

    Java Attach API,即Java虚拟机提供的一套API,用于Java进程间的通讯,常用于实现JVM监控、远程调试、Agent实现等。本篇完整使用攻略将详细讲解Java Attach API的使用方法和应用场景。 1. 什么是Java Attach API Java Attach API包含在JDK中,提供了一套用于管理Java虚拟机的API,可以用…

    Java 2023年5月11日
    00
  • 如何将maven源改为国内阿里云镜像

    下面是将Maven源改为国内阿里云镜像的完整攻略。 修改Maven配置文件 Maven 的配置文件 settings.xml 存放在 Maven 安装目录下的 conf 目录中。我们需要修改该配置文件来指定使用阿里云镜像。使用文本编辑器打开该文件,找到 <mirrors> 标签,添加如下配置: <mirror> <id>a…

    Java 2023年5月20日
    00
  • maven-compiler-plugin版本指定方式

    当我们在使用Maven构建Java项目时,通常需要编译Java源代码。而编译Java源代码需要用到maven-compiler-plugin插件。本篇攻略将详细讲解如何指定maven-compiler-plugin的版本。 步骤一:在pom.xml文件中添加maven-compiler-plugin的配置信息 在pom.xml文件中,我们可以通过<bu…

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