千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > HttpSecurity详解

HttpSecurity详解

来源:千锋教育
发布人:xqq
时间: 2023-11-23 14:27:15 1700720835

一、HttpSecurity源码

HttpSecurity类是Spring Security核心配置类之一,用来配置Spring Security的行为,包括认证方式、权限控制、CSRF保护等。我们先来看一下HttpSecurity类的源码结构:


@Configuration
public final class HttpSecurity extends
        AbstractConfiguredSecurityBuilder
        implements SecurityBuilder, SecurityConfigurerAware, HttpSecurity>, HttpSecurityBuilder {

    // 构造方法
    public HttpSecurity(ObjectPostProcessor objectPostProcessor, AuthenticationManagerBuilder builder,
                        Map, Object> sharedObjects) {
        super(objectPostProcessor, true, sharedObjects);
        // come code here...
    }

    // 配置方法
    public HttpSecurity requestMatcher(RequestMatcher requestMatcher) {
        // some code here...
        return this;
    }

    // some other methods...

}

如上代码所示,HttpSecurity是一个@Configuration配置类,继承了AbstractConfiguredSecurityBuilder类,并实现了SecurityBuilder和SecurityConfigurerAware接口。其中,requestMatcher方法用于匹配请求的URL,根据匹配结果来对请求进行处理。

二、HttpSecurity的用法

使用方法可以分为以下几步:

1、创建一个SecurityConfigurer,并在其中重写configure方法,实现对HttpSecurity的配置;

2、通过调用HttpSecurity的apply方法,并传入第一步创建的SecurityConfigurer,来将SecurityConfigurer中的配置应用到HttpSecurity中;

3、配置成功后,HttpSecurity会返回一个DefaultSecurityFilterChain类型的对象,用于构建安全过滤器链。

三、HttpSecurity配置

3.1 HttpSecurity默认配置

当我们没有对HttpSecurity进行额外的配置时,Spring Security会使用默认配置。默认配置包括以下内容:


http
    .authorizeRequests()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .and()
    .httpBasic();

以上代码表示,所有请求需要进行身份验证,并且要求用户使用表单登录或HTTP基本认证。

3.2 HttpSecurity权限配置详解

针对不同路径和请求类型,我们可以配置不同的授权策略。


http.authorizeRequests()
    .antMatchers("/admin/**").hasRole("ADMIN")
    .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
    .anyRequest().authenticated()
    .and()
.formLogin()
    .loginPage("/login")
    .permitAll()
    .and()
.logout()
    .permitAll();

以上代码表示,对于"/admin/**"路径下的请求,需要有"ADMIN"角色方可访问;对于"/db/**"路径下的请求,需要有"ADMIN"和"DBA"两个角色方可访问;而其他请求只需要在通过身份验证后即可访问。同时,我们还可以设置登录页和退出页。

3.3 HttpSecurity解密失败怎么回事

解密失败可能是因为客户端传递的数据被篡改或者密钥不正确,当出现解密失败的情况,可以使用以下代码对HttpSecurity进行配置:


http.exceptionHandling()
    .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
    .accessDeniedHandler(new AccessDeniedHandlerImpl());

以上代码为设置Http403ForbiddenEntryPoint和AccessDeniedHandlerImpl类,用于处理解密失败后的异常情况。

四、完整代码示例

下面是一个完整的HttpSecurity配置示例:


@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .permitAll()
            .and()
        .exceptionHandling()
            .authenticationEntryPoint(new Http403ForbiddenEntryPoint())
            .accessDeniedHandler(new AccessDeniedHandlerImpl());
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
    }

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

以上代码为一个完整的Spring Security配置类示例,其中包含了对HttpSecurity和AuthenticationManagerBuilder的配置。

tags: httpsecurity
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT