侧边栏壁纸
  • 累计撰写 7 篇文章
  • 累计创建 5 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Spring security

Lieey
2024-06-28 / 0 评论 / 0 点赞 / 49 阅读 / 9936 字

为什么使用Spring security ?

它可以保护应用程序、管理访问控制以及提高整体系统安全性,以下是一些常用功能:

  • 身份验证与授权

    • 身份验证:表单登录、OAuth2、JWT等等

    • 授权:确定用户是否有权访问特定资源,可以基于角色或基于权限的访问控制来实现

  • 可以防止一些常见的攻击

  • 集成与扩展性

    Spring security与Spring生态系统中的其他组件可以无缝集成,它非常适合现代微服务架构

  • 集中管理

    在微服务架构中,每个微服务可能都有不同的安全需求,Spring secrity提供了集中管理安全策略的能力

    • 集中认证:使用单一的授权服务器进行认证,简化用户管理

    • 统一授权:在网关层进行统一的授权管理,减少重复配置。

  • 保护敏感数据

    通过加密和安全传输协议(如Https),Spring secrity 确保数据在传输中不会被窃取或篡改。

使用场景示例

身份验证和授权

在一个在线购物系统中,管理员和普通用户的权限不同:

  • 普通用户可以浏览商品和下订单。

  • 管理员可以管理商品和订单。

通过Spring Security,可以轻松地实现基于角色的访问控制。

保护API

在一个微服务架构的系统中,各个服务之间通过API进行通信。使用Spring Security可以确保只有合法的请求才能访问这些API:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
​
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll() // 允许访问公共资源
            .anyRequest().authenticated();         // 其他所有请求需要认证
    }
}

集成OAuth2

在一个应用中,使用OAuth2进行第三方登录(如Google、Facebook):

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
​
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("client-id")
                .secret("{noop}client-secret")
                .authorizedGrantTypes("authorization_code", "refresh_token", "password", "client_credentials")
                .scopes("read", "write")
                .redirectUris("http://localhost:8080/login/oauth2/code/custom");
    }
​
    // 其他配置代码
}

总结

Spring Security通过提供全面的安全功能、灵活的配置选项以及与Spring生态系统的无缝集成,使开发者能够轻松地构建和管理安全的应用程序。在现代微服务架构中,使用Spring Security可以显著提高系统的整体安全性,确保应用程序和数据免受各种安全威胁。

在SpringCloud项目中集成Spring Secrity

  • 引入依赖

  • 配置安全性

    创建一个Spring Secrity配置类。例如在网关服务中,你可以保护所有的微服务:

    @Configuration
    @EnableWebSecurity
    @EnableResourceServer
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    ​
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .antMatchers("/public/**").permitAll() // 允许访问公共资源
                .anyRequest().authenticated()          // 其他所有请求需要认证
                .and()
                .oauth2Login();                        // 启用OAuth2登录
        }
    }

  • 配置授权服务器

    在你的授权服务器中(通常是一个独立的微服务),配置Spring Secrity和OAuth2。例如:

    @Configuration
    @EnableAuthorizationServer
    public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
    ​
        @Override
        public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
            clients.inMemory()
                    .withClient("client-id")
                    .secret("{noop}client-secret")
                    .authorizedGrantTypes("authorization_code", "refresh_token", "password", "client_credentials")
                    .scopes("read", "write")
                    .redirectUris("http://localhost:8080/login/oauth2/code/custom");
        }
    ​
        @Override
        public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
            endpoints.tokenStore(tokenStore())
                    .accessTokenConverter(accessTokenConverter());
        }
    ​
        @Override
        public void configure(AuthorizationServerSecurityConfigurer security) {
            security.tokenKeyAccess("permitAll()")
                    .checkTokenAccess("isAuthenticated()");
        }
    ​
        @Bean
        public TokenStore tokenStore() {
            return new JwtTokenStore(accessTokenConverter());
        }
    ​
        @Bean
        public JwtAccessTokenConverter accessTokenConverter() {
            JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            converter.setSigningKey("your-signing-key"); // 使用对称密钥
            return converter;
        }
    }
  • 配置资源服务器

    在每一个需要保护的服务中,配置它们作为资源服务器,例如:

    @Configuration
    @EnableResourceServer
    public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    ​
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                .antMatchers("/public/**").permitAll() // 允许访问公共资源
                .anyRequest().authenticated();         // 其他所有请求需要认证
        }
    }
  • 配置应用程序属性

    确保在每个微服务的配置文件中(application.yml)设置正确的Oauth2属性。例如:

    # 应用程序属性示例
    spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8080/.well-known/jwks.json
  • 完整示例

    这是一个完整的SpringCloud项目结构的简要概述:

    1. 网关服务

    2. 授权服务器

    3. 多个受保护的微服务

    每个服务都配置了Spring Security,并且资源服务器配置为使用JWT令牌进行验证。此结构确保了整个系统的安全性,同时提供了集中化的身份验证和授权管理。

0

评论区