详解Springboot2.3集成Spring security 框架(原生集成)

我来为你详细讲解“详解Springboot2.3集成Spring security框架(原生集成)”的完整攻略。

1. 简介

Spring Security是Spring Framework的一个安全框架,为Spring应用程序提供综合的认证(Authentication)和授权(Authorization)解决方案。这个框架提供了一种方式来将应用程序的用户(user)和用户的角色(role)与底层操作系统解耦。本文介绍如何在Spring Boot 2.3版本中集成Spring Security框架。

2. 集成Spring Security框架

2.1 项目依赖配置

在你的Spring Boot项目中,需要在pom.xml中添加以下依赖:

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

2.2 自定义Security配置类

在Spring Boot中,可以通过编写自定义的WebSecurityConfigurerAdapter类来设置Spring Security的配置。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}

这个配置类定义了Spring Security的登录页、登出页、用户角色、拦截规则等。

2.3 配置密码存储方式

Spring Security默认使用BCryptPasswordEncoder对密码进行加密。

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

2.4 启用HTTPS

建议在生产环境中启用HTTPS。下面的示例演示了如何在Spring Boot中启用HTTPS。

@Configuration
public class HttpsConfig {

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint = new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
        return tomcat;
    }

    private Connector httpToHttpsRedirectConnector() {
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createHttpConnector());
        return tomcat;
    }

    private Connector createHttpConnector() {
        Connector connector =
                new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setScheme("http");
        connector.setPort(8080);
        connector.setSecure(false);
        connector.setRedirectPort(8443);
        return connector;
    }
}

2.5 使用Spring Security验证API

可以使用Spring Security的AuthenticationManager验证API。

@RestController
public class UserController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping("/login")
    public ResponseEntity<?> authenticate(@RequestBody AuthenticationRequest request) throws Exception {
        try {
            Authentication authentication = authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
            );
            SecurityContextHolder.getContext().setAuthentication(authentication);
            return ResponseEntity.ok(new AuthenticationResponse("SUCCESS"));
        } catch (BadCredentialsException e) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new AuthenticationResponse("INVALID_CREDENTIALS"));
        }
    }
}

3. 示例

3.1 基本示例

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("{noop}password").roles("USER");
    }
}
@RestController
public class UserController {

    @Autowired
    private AuthenticationManager authenticationManager;

    @PostMapping("/login")
    public ResponseEntity<?> authenticate(@RequestBody AuthenticationRequest request) throws Exception {
        try {
            Authentication authentication = authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
            );
            SecurityContextHolder.getContext().setAuthentication(authentication);
            return ResponseEntity.ok(new AuthenticationResponse("SUCCESS"));
        } catch (BadCredentialsException e) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new AuthenticationResponse("INVALID_CREDENTIALS"));
        }
    }

    @GetMapping("/secure")
    public String secure() {
        return "Secure!";
    }
}

3.2 OAuth2.0示例

<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(ClientDetailsServiceConfigurer configurer) throws Exception {
        configurer
            .inMemory()
                .withClient("client")
                .authorizedGrantTypes("password", "refresh_token")
                .scopes("read", "write")
                .secret("{noop}secret")
                .accessTokenValiditySeconds(300)
                .refreshTokenValiditySeconds(3600);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
            .authenticationManager(authenticationManager)
            .tokenStore(tokenStore())
            .accessTokenConverter(accessTokenConverter());
    }

    @Bean
    public TokenStore tokenStore() {
        return new InMemoryTokenStore();
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("secret");
        return converter;
    }
}
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/hello/**").authenticated()
                .anyRequest().permitAll();
    }

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.resourceId("my_resource");
    }

    @Bean
    public RemoteTokenServices tokenServices() {
        RemoteTokenServices tokenServices = new RemoteTokenServices();
        tokenServices.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token");
        tokenServices.setClientId("client");
        tokenServices.setClientSecret("secret");
        return tokenServices;
    }
}
@RestController
public class HelloController {

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable String name) {
        return "Hello, " + name + "!";
    }
}

以上就是详解Springboot2.3集成Spring security 框架(原生集成)的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Springboot2.3集成Spring security 框架(原生集成) - Python技术站

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

相关文章

  • 详解SpringBoot定时任务说明

    下面我来详细讲解一下“详解SpringBoot定时任务说明”的完整攻略。 什么是SpringBoot定时任务? SpringBoot定时任务是指在特定的时间或周期性的执行一些任务,比如定时生成报表、清理数据库等。SpringBoot框架中提供了丰富的定时任务支持,可以通过简单的配置来实现这些任务。 定时任务的实现方式 基于注解和功能接口实现定时任务 Spri…

    Java 2023年5月19日
    00
  • 详解用java描述矩阵求逆的算法

    详解用Java描述矩阵求逆的算法 算法概述 在线性代数中,矩阵求逆是一个很重要的问题,它在各种科学计算中发挥着关键作用。矩阵求逆也被用于解决多元线性回归等问题。 基本上所有矩阵求逆算法都是基于高斯-约旦变换(Gauss-Jordan elimination)来工作的,该算法旨在通过对原始矩阵进行顺序消元、列缩放和行交换等操作,从而生成一个沿着对角线对称的单位…

    Java 2023年5月19日
    00
  • SpringBoot jdbctemplate使用方法解析

    SpringBoot JdbcTemplate 使用方法解析 在SpringBoot中,我们可以通过使用JdbcTemplate来简化我们的数据库操作。本文将给出关于使用JdbcTemplate的详细说明和示例代码。我们将从以下方面给出解析: 配置SpringBoot和JdbcTemplate JdbcTemplate基本的CURD操作 示例代码 配置Spr…

    Java 2023年5月20日
    00
  • Spring boot Mybatis 整合(完整版)

    下面我就为您详细讲解“SpringbootMybatis整合(完整版)”的完整攻略。 简介 在介绍完整攻略之前,我先来简单介绍一下SpringBoot和Mybatis。 Spring Boot是Spring家族的一款新型的轻量级框架。它本身封装了许多传统配置,使开发人员可以非常迅速地开发Spring应用程序。而Mybatis则是一款持久层框架,用来操作数据库…

    Java 2023年5月15日
    00
  • web开发中添加数据源实现思路

    我来详细讲解web开发中添加数据源实现思路的完整攻略。在web开发过程中,我们需要添加数据源来提供数据支持。其中包括本地文件、数据库、网络API等多种形式。下面介绍一般的实现思路。 1. 确认数据源类型和数据格式 在添加数据源前,首先需要确认数据源的类型和数据格式。不同的数据源类型和数据格式,需要使用不同的方法进行访问和处理。比如,如果数据源是本地文件,需要…

    Java 2023年6月15日
    00
  • JAVA日期处理类详解

    JAVA日期处理类详解 在JAVA编程中,日期处理是非常重要的一部分内容。JAVA内置了许多日期处理类,下面就来详细地介绍一下。 java.util.Date类 java.util.Date类是JAVA中最早的关于日期时间处理的类。在JAVA8之前,它被广泛使用。但是由于它的一些不足之处,比如日期时间格式化问题,API设计不具有可读性等等,所以在JAVA8之…

    Java 2023年5月20日
    00
  • jsp中自定义标签用法实例分析

    下面是关于“jsp中自定义标签用法实例分析”的攻略。 一、自定义标签的基本概念和使用 自定义标签是指用户可以自行设定标签名称,通过编写自定义标签类来达到自己想要的功能,或用既有的标签库来达到相应的目的。在使用自定义标签的过程中,首先需要在jsp页面上导入标签库,然后就可以使用标签库中的标签了。具体步骤如下: 在jsp页面中引入标签库,方式如下: jsp &l…

    Java 2023年6月15日
    00
  • SpringMVC KindEditor在线编辑器之文件上传代码实例

    下面我就针对“SpringMVC KindEditor在线编辑器之文件上传代码实例”的完整攻略进行详细的讲解: 具体操作步骤 步骤一:引入相关依赖 在SpringMVC项目的pom.xml文件中加入以下代码: <!– 文件上传依赖 –> <dependency> <groupId>commons-fileupload&…

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