spring security

一、spring-security-web

1、引入jar包

	<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.8</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-web</artifactId>
      <version>5.1.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-config</artifactId>
      <version>5.1.4.RELEASE</version>
  </dependency>

2、编写配置类

2.1、WebConfig

等同于spring-mvc.xml

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.mlj.indi")
public class WebConfig implements WebMvcConfigurer {
    //视图解析器
    @Bean
    public InternalResourceViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB‐INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }
    /*设置页面跳转
    * 此处可设置一些没有业务逻辑的页面跳转
    * */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("redirect:/login");
    }
}
2.2、SpringApplicationConfig

​ 等同于applicationContext-*.xml

@Configuration
@ComponentScan(basePackages = "com.mlj.indi")
public class SpringApplicationConfig {
    //在此配置除了Controller的其它bean,比如:数据库链接池、事务管理器、业务bean等。
}

3、初始化

3.1、初始化spring容器
public class SpringApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    /**
     * 指定applicationContext配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {SpringApplicationConfig.class};//指定rootContext的配置类
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class }; //指定servletContext的配置类
    }
    @Override
    protected String[] getServletMappings() {
        return new String [] {"/"}; //设置访问根目录
    }
}

至此一个spirng工程已经搭建完成,接下来将spring secrurity集成进来

4、集成spring secrurity

4.1 Security配置类

编写Security配置类,注入两个bean:
1、PasswordEncoder主要做密码解析,PasswordEncoder是一个接口,security提供了内置的实现类,此处使用最简单的NoOpPasswordEncoder,不对密码进行加密,使用明文密码
2、UserDetailsService 主要用来实现从数据库加载用户信息,security会根据加载的用户信息与登录用户做比较
重写一个配置方法:
在 configure 方法中实现security 的拦截策略配置

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager manager=new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("zhangsan").password("123").authorities("p1").build());
        manager.createUser(User.withUsername("lisi").password("456").authorities("p2").build());
        return manager;
    }
    //密码解析器
    @Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
    // 配置安全拦截机制
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //拦截所有/test/请求需要经过身份验证,未收到拦截的路径可以直接访问,收到拦截的路径需登录后才能访问
                .antMatchers("/*").authenticated()
                //根据不同的权限访问不同的路径
                .antMatchers("/test/r1").hasAuthority("p1")
                .antMatchers("/test/r2").hasAuthority("p2")
                ///test打头的请求以外 的其他请求全部放行
                .anyRequest().permitAll()
                .and()
                .formLogin()//允许表单登录
                .successForwardUrl("/login-success");//自定义登录成功的页面地址
    }
}
4.2 初始化SpringSecurity
public class SpringSecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    public SpringSecurityApplicationInitializer() {
        /*往父类里面传入配置类的方式来初始化Security配置,*/
        /*此种方式与在SpringApplicationInitializer的getRootConfigClasses
        里传入配置类的方式作用相同都是初始化Security配置类*/
        //super(WebSecurityConfig.class);
    }
}

至此一个spring security 的web 架构已经搭建完成,测试一下,编写一个测试用的controller

@RestController
public class LoginController {

    @RequestMapping(value = "/login-success",produces = {"text/plain;charset=UTF-8"})
    public String loginSuccess(){
        return " 登录成功!";
    }
 
    @GetMapping(value = "/r/test",produces = {"text/plain;charset=UTF-8"})
    public String test(){
        return " 访问资源1";
    }
    /**
     * 测试资源1
     * @return
     */
    @GetMapping(value = "/test/r1",produces = {"text/plain;charset=UTF-8"})
    public String r1(){
        return " 访问资源1";
    }

    /**
     * 测试资源2
     * @return
     */
    @GetMapping(value = "/test/r2",produces = {"text/plain;charset=UTF-8"})
    public String r2(){
        return " 访问资源2";
    }
}

5、测试

4.1 在Security的配置类中定义了拦截机制以及两个测试用户,分别对两个测试用户赋予不同的角色,启动之后通过浏览器访问http://localhost:8080/springSecurity/login 打开登录地址即可看到测试效果

在这里插入图片描述

登录成功后 访问测试资源,无权访问的显示403,有权限的直接进入方法
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值