2020年8月

spring security

Spring security 是一个强大的和高度可定制的身份验证和访问控制框架。它是确保基于Spring的应用程序的标准。更多请预览官方文档:https://spring.io/projects/spring-security 中文版文档:https://www.springcloud.cc/spring-security-zhcn.html
一、核心功能
认证
授权
攻击防护

二、原理

(一)整个框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain类型是FilterChainProxy
(二)核心过滤器里面是过滤器链(列表),过滤器链的每个元素都是一组URL对应一组过滤器
(三)WebSecurity用来创建FilterChainProxy过滤器,HttpSecurity用来创建过滤器链的每个元素。

引用 持盾的紫眸的【深入浅出Spring Security(一):三句话解释框架原理】

三、使用

特殊说明:以下内容是以本人项目需求为标准配置的spring security,也是基于spring boot框架的。

(一)引入依赖(pom.xml)

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

(二)配置

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
     @Autowired
     private UserDetailsService userDetailsService;
     @Autowired
     private PasswordEncoder passwordEncoder;
     @Override
     protected void configure(HttpSecurity http) throws Exception {
     http.csrf().disable();
     // 基于token,所以不需要session
     http.sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .formLogin()//表单登录
            .usernameParameter("mobile")
            .passwordParameter("password")
            .loginProcessingUrl("/formLogin")
            .permitAll()
            .successHandler(authenticationSuccessHandler)//登陆成功的处理
            .failureHandler(authenticationFailureHandler)//登陆失败的处理
            .and()
            .authorizeRequests()
            .antMatchers(
                    "/v2/**",//swagger相关工具页面
                    "/swagger-resources/**",//swagger相关工具页面
                    "/swagger-ui.html/**"//swagger相关工具页面
            )//白名单,不验证,不授权,不防护
            .permitAll()//permitALL()表示放开和登陆有关的接口
            .anyRequest().authenticated()//除白名单外都需要验证才可访问
            .and()
            .csrf()
            .disable()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(logoutSuccessHandler)
            .permitAll(false)
            .and()
            .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint)
    ;// 自定义的过滤器顺序为:ipFilter -> logFilter -> jwtClientTypeFilter -> tokenFilter -> sendSmsFilter
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
}
}

1、

swagger ui

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

一、作用

(一)接口的文档在线自动生成。
(二)功能测试。

二、主要项目

(一)Swagger-tools:提供各种与Swagger进行集成和交互的工具。例如模式检验、Swagger 1.2文档转换成Swagger 2.0文档等功能。
(二)Swagger-core: 用于Java/Scala的的Swagger实现。与JAX-RS(Jersey、Resteasy、CXF...)、Servlets和Play框架进行集成。
(三)Swagger-js: 用于JavaScript的Swagger实现。
(四)Swagger-node-express: Swagger模块,用于node.js的Express web应用框架。
(五)Swagger-ui:一个无依赖的HTML、JS和CSS集合,可以为Swagger兼容API动态生成优雅文档。
(六)Swagger-codegen:一个模板驱动引擎,通过分析用户Swagger资源声明以各种语言生成客户端代码。

三、maven

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>1.0(版本自行选择)</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>1.0(版本自行选择)</version>
</dependency>

四、使用(spring boot)
(一)配置

swagger:
enable: true

(二)创建SwaggerAppConfig

@EnableSwagger2
@Configuration
public class SwaggerAppConfig {
    @Value("${swagger.enable}")
    private boolean enableSwagger;
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
            .title("接口文档")
            .description("服务调试接口")
            .contact(ApiInfo.DEFAULT_CONTACT)
            .version("1.0.1")
            .build();
    }
   @Bean
   public Docket commonWechat() {
       Docket docket = new Docket(DocumentationType.SWAGGER_2);
       docket.enable(enableSwagger)
            .groupName("测试相关API")
            .apiInfo(apiInfo())
            .select()
            .paths(PathSelectors.regex("/common/.*"))
            .build();
      return docket;
   }

}

(二)接口文件注入@Api(description = "基础服务API")

@Api(description = "基础服务API")
@RestController
@RequestMapping("/common")
public class CommonController extends BaseController {

}