Spring Security 学习笔记(三)

本文介绍了Spring Security的基本概念和在SpringMVC架构下的快速上手步骤,包括创建Maven工程、设置依赖、认证页面的默认使用,以及安全配置的详细讲解,特别是如何进行权限控制实现授权功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.Spring Security快速上手(使用SpringMVC架构)

3.1Spring Security介绍

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Spring生态系统中的一员,因此它伴随着整个Spring生态系统的不断修正、升级,在SpringBoot项目中加入Spring Security更是十分简单,使用Spring Security减少了为企业系统安全控制编写大量重复代码的工作。

3.2创建Maven工程

引入SpringMVC的依赖包,还有Spring Security的依赖:

<!--  Security依赖 start  -->
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>5.3.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>5.3.2.RELEASE</version>
    </dependency>
<!--  Security依赖 end  -->

因为Servlet3.0支持使用Java类配置MVC,所以就不使用xml文件方式。

建一个ApplicationConfig类,此类替代applicationContext.xml配置文件,具体代码如下:

@Configuration//相当于applicationContext.xml
@ComponentScan(basePackages = "com.hwj.securitytest",
        excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)})
public class ApplicationConfig {
    //在此配置除了Controller的其他bean,比如:数据库连接池、事务管理器、业务bean等。

}

建一个WebMVCConfig类,此类替代springMVC.xml文件,具体代码如下:

@Configuration//相当于springMvc.xml文件
@EnableWebMvc
@ComponentScan(basePackages = "com.hwj.securitytest",
                includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = Controller.class)})
public class WebMvcConfig implements WebMvcConfigurer {

    //视图解析器
    @Bean
    public InternalResourceViewResolver internalResourceViewResolver(){
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        internalResourceViewResolver.setPrefix("/WEB-INF/view/");
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }

    //视图映射器

}

建一个初始化Spring容器的类:

public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{ApplicationConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

到此,Spring Security 在SpringMVC中的环境已经搭建完成。

3.3认证

3.3.1认证页面

Spring Security 默认提供认证页面,不需要额外开发。

3.3.2安全配置

Spring Security提供了用户名和密码登录、退出、会话管理认证功能,只需要配置即可使用。

1)定义一个配置Security的类(类名随便取),继承WebSecurityConfigurerAdapter类,并在类上加注解@EnableWebSecurity。安全配置的内容包括:用户信息、密码编辑器、安全拦截机制。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    //定义用户信息服务(查询用户信息)
    @Bean
    public UserDetailsService userDetailsService(){
        //基于内存查
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123456").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("12345678").authorities("p2").build());
        return manager;
    }
    //密码编码器(有多种)
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
    //安全拦截机制

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //表示所有/r/**请求必须认证通过
        http.authorizeRequests().antMatchers("/r/**").authenticated()
        .anyRequest().permitAll()//除了/r/**,其他请求可以访问
        .and().formLogin()//允许表单登录
        .successForwardUrl("/loginSuccess");//自定义登陆成功的页面地址
    }
}

定义一个初始化Security的类:

public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
    public SpringSecurityApplicationInitializer(){

    }
}

在WebConfig类中添加视图映射器:

    //视图映射器

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:/login");//表示重定向到Security提供的登陆页面,自己无需新建login页
    }

效果:

3.4授权

只允许有p1权限的用户访问资源r1,只允许有p2权限的人访问资源r2:

则Security配置类中安全拦截机制的代码为:

    //安全拦截机制
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
        .antMatchers("/r/r1").hasAuthority("p1")
        .antMatchers("/r/r2").hasAuthority("p2")
        .antMatchers("/r/**").authenticated()//表示所有/r/**请求必须认证通过
        .anyRequest().permitAll()//除了/r/**,其他请求可以访问
        .and().formLogin()//允许表单登录
        .successForwardUrl("/loginSuccess");//自定义登陆成功的页面地址
    }

lisi只有p2权限,当lisi去访问r1时:

403状态码表示未授权。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值