spring cloud------spring security简单使用一

spring security的简单原理:

使用众多的拦截器对url拦截,以此来管理权限。但是这么多拦截器,笔者不可能对其一一来讲,主要讲里面核心流程的两个。

首先,权限管理离不开登陆验证的,所以登陆验证拦截器AuthenticationProcessingFilter要讲;还有就是对访问的资源管理吧,所以资源管理拦截器AbstractSecurityInterceptor要讲;但拦截器里面的实现需要一些组件来实现,所以就有了AuthenticationManager、accessDecisionManager等组件来支撑。

现在先大概过一遍整个流程,用户登陆,会被AuthenticationProcessingFilter拦截,调用AuthenticationManager的实现,而且AuthenticationManager会调用ProviderManager来获取用户验证信息(不同的Provider调用的服务不同,因为这些信息可以是在数据库上,可以是在LDAP服务器上,可以是xml配置文件上等),如果验证通过后会将用户的权限信息封装一个User放到spring的全局缓存SecurityContextHolder中,以备后面访问资源时使用。

访问资源(即授权管理),访问url时,会通过AbstractSecurityInterceptor拦截器拦截,其中会调用FilterInvocationSecurityMetadataSource的方法来获取被拦截url所需的全部权限,在调用授权管理器AccessDecisionManager,这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取被拦截的url和被拦截url所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回,权限不够则报错并调用权限不足页面。

虽然讲得好像好复杂,读者们可能有点晕,不过不打紧,真正通过代码的讲解在后面,读者可以看完后面的代码实现,再返回看这个简单的原理,可能会有不错的收获。

在spring boot中使用security
首先导入spring security的包:

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

在spring security中有一个非常重要的配置类需要编写
就是继承这个抽象类WebSecurityConfigurerAdapter,如下代码所示
这个bean的目的是将我们的用户存到内存中,这个用于调试还是可以的,但是我们开发中是不存在这样的

@Bean
        @Override
        protected UserDetailsService userDetailsService(){
            InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
            manager.createUser(User.withUsername("user_1").password("123456").authorities("USER").build());
            manager.createUser(User.withUsername("user_2").password("123456").authorities("USER").build());
            return manager;
        }

另一种方式就是实现UserDetailsService的接口,然后在loadUserByUsername里面写自己的逻辑方法,
如下:

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // TODO Auto-generated method stub
        if(username.equals("root")){
            return new User(username, "", true, true, true, true,
                    AuthorityUtils.NO_AUTHORITIES);
        }
        return null;
    }

返回user,这个user是实现了userdetail的接口,然后返回一个user,,这些参数你们可以自己去看下是什么意思,前面两个就是用户名和密码,主要是为了去进行比对
还有一个主角就是

  @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
//            .antMatchers("/**").permitAll()//spring security对路径不拦截
              .anyRequest().authenticated()//所有请求需要认证即登录后才能访问
              .and()
              .formLogin()
              .permitAll()
              .and()
          .logout()
              .permitAll();
            // @formatter:on
        }

看上面的就知道大概的意思吧,主要是为了鉴权,意思就是哪些接口是需要拦截的,而permitAll是代表放行的意思,就是这些接口不拦截,而我们这边设置了所有的接口都拦截,除了登录和登出。‘

上面这步完成后还需要我们将userdetail的类给添加到拦截器中,因为我们登录是需要进行验证用户的,所以可以直接

  @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }

这里面还可以设置其他参数,比如加密的方式以及其他等等。
在这个类中海可以设置一写忽略的拦截类,即不需要进行验证的
/**
* 忽略设置的接口
*/

@Override
  public void configure(WebSecurity web) throws Exception {
    String ignoring = env.getProperty("msi.auth.ignoring","/health|/info");
    web.ignoring().antMatchers(ignoring.split("\\|"));
  }

不管是使用哪种方式,将用户存到内存或者存到数据库操作,都需要将操作放到

  @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }这里面

在这里面还可以使用这种方式

@Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            DaoAuthenticationProvider au=new DaoAuthenticationProvider();
            au.setUserDetailsService(userDetailsService);
            au.setPasswordEncoder(pd);
            au.setSaltSource(salt);
            auth.authenticationProvider(au);
//          auth.userDetailsService(userDetailsService);
        }

这种的目的是为了进行多种方式验证,比如可以通过账号和密码,或者是手机号码和密码等等,这里面可以自定义加密.
DaoAuthenticationProvider这里面有密码的比对

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringSecuritySpringCloud是两个独立的框架,但它们可以一起使用来构建安全的分布式系统。SpringSecurity是一个用于身份验证和授权的框架,可以帮助我们保护应用程序的安全性。而SpringCloud是一个用于构建分布式系统的框架,它提供了一系列的工具和组件,用于处理分布式系统中的各种问题,例如服务发现、负载均衡、配置管理等。 在引用[1]中提到的文章中,作者介绍了他对SpringSecurity的深入研究和源码分析的经历。他从最初只会简单接入SpringSecurity,到深入了解整个体系,深入源码,逐步提升了自己的技能。这也说明了SpringSecurity的重要性和价值。 在引用[2]中提到了SpringSecurity OAuth2的默认过滤器链和自定义过滤器链。默认的过滤器链只处理特定的请求,而自定义的过滤器链则处理其他请求。需要注意的是,自定义过滤器链中并没有解析Token的过滤器,这可能导致即使加了Token,权限满足的情况下,仍然返回403未授权的错误。在SpringSecurity OAuth2体系中,SpringSecurity主要负责授权操作,而认证操作通常由资源服务器处理。 在引用[3]中提到了整合SpringCloudSpringSecurity OAuth2的搭建流程。作者通过这篇文章梳理了整个流程,帮助读者理清思路。这对于那些想要构建安全的分布式系统的开发者来说是非常有价值的。 综上所述,SpringSecuritySpringCloud是两个独立的框架,但可以一起使用来构建安全的分布式系统。SpringSecurity负责身份验证和授权,而SpringCloud提供了一系列工具和组件来处理分布式系统中的各种问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值