Spring Security 入门(三)

在说完了Spring Security框架的功能和执行流程后,就到了写它Spring Boot的集成,先来看最简的配置:

<parent>  <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>2.0.6.RELEASE</version>
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
 <dependencies>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-security</artifactId>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
 </dependencies>      

  此时,直接运行程序,页面会跳出都会弹出一个“需要授权”的验证框:

  Spring Security会默认生成一个用户,用户名为user,密码可以再IDE的控制台(Console)中查看,输入用户名和密码后就可以访问请求的URL了。

  在我们实际的开发中,肯定需要我们定义访问哪些URL需要登录并拥有相关的权限,访问哪些URL不需要登录,以及验证失败后的跳转页面等。配置方式:定义继承WebSecurityConfigurerAdapter 类WebSecurityConfig类,并加上@Configuration 和@EnableWebSecurity两个注解,开启Spring Security功能,并交由容器进行管理。具体配置如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig  extends WebSecurityConfigurerAdapter{

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub

        http
            .authorizeRequests()          //指定任何用户都可以访问‘/‘路径,permitAll()表示任何用户都可以访问
                .antMatchers("/").permitAll()          //以"/admin/"开头的URL,只能让"USER"角色权限的用户访问
                .antMatchers("/user/**").hasRole("USER")
                .and()          //通过formLogin方法登录,并设置登录url为/login,登录成功后跳转/user页面
            .formLogin()
                .loginPage("/login").defaultSuccessUrl("/user")
                .and()
            .logout()          //指定登出的url,登出成功后跳转的url路径
                .logoutUrl("/logout").logoutSuccessUrl("/login");
    }    @Override  protected void configure(AuthenticationManagerBuilder auth) throws Exception{    /**     * 在内存中创建一个名为 "user" 的用户,密码为 "pwd",拥有 "USER" 权限,密码使用BCryptPasswordEncoder加密     */    auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())      .withUser("user").password(new BCryptPasswordEncoder().encode("pwd")).roles("USER");  }

  /**
  * 添加 UserDetailsService, 实现自定义登录校验
  */
  @Override
  protected void configure(AuthenticationManagerBuilder builder) throws Exception{
    builder.userDetailsService(anyUserDetailsService);
  }

}

这是Spring Security进行权限校验管理的一个基本配置啦!

  其实看到这里心里还是有很多疑惑:

  • 一般用户的信息都是保存在数据库中,那就还要涉及从数据库中读取信息进行验证;
  • 登录成功后登录信息保存在哪,保存在SecurityContextHolder中吗?;
  • 一般来说还需要自定义用户认证的流程,因为你要从数据库中读取数据,发生错误时需要相关的提示信息;
  • 用户登录具体的验证流程是什么样的,该如何重写自定义验证流程?;

  这些疑惑网上早就有人想到了,接着看下面的文章。

  在知乎和简书上面找到了两张认证流程的图,直观地展示一下:

  

                           图一

                            图二

  在Spring Security入门(二)中提到,用户登录时登录信息会封装在Authentication中,然后传递给AuthenticationManager实例进行验证。Authentication是如何在AuthenticationManager实例中进行验证的?具体的流程就如图一所示:

  1. AuthenticationManager,它是验证管理类的总接口;
  2. 而具体的验证管理需要ProviderManager类,它具有一个List<AuthenticationProvider> providers属性,这实际上是一个AuthenticationProvider实例构成的验证链;
  3. 链上都是各种AuthenticationProvider实例,这些实例进行具体的验证工作。

  所以根据图二,大致的验证流程如下:

  1. 后端从前端的表单得到用户密码,包装成一个Authentication类的对象;
  2. 将Authentication对象传给“验证管理器”ProviderManager进行验证;
  3. ProviderManager在一条链上依次调用AuthenticationProvider进行验证;
  4. 其中DaoAuthenticationProvider依赖于UserDetailsService,调用UserDetailsService实例的loadUserByUsername方法,会返回一个UserDetails实例,将UserDetails实例与Authentication对象进行比对;
  5. 验证成功则返回一个封装了权限信息的Authentication对象(即对象的Collection<? extends GrantedAuthority>属性被赋值);
  6. 将此对象放入安全上下文SecurityContext中;
  7. 需要时,可以将Authentication对象从SecurityContextHolder上下文中取出。

  还记得上文提到说,用户数据存放于数据库时该如何读取用户信息进行认证吗?没错,就是自定义一个UserDetailsService的类,主要是重写它的loadUserByUsername方法,将用户信息封装在UserDetails对象中。看个具体的栗子:

@Service
public class AnyUserDetailService implements UserDetailsService{
    //DAO层的代码省略
    @Autowired
    private UserMapper userMapper; 

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // TODO Auto-generated method stub
        User user = userMapper.selectByUsername(username);
        if(user == null) {
            throw new UsernameNotFoundException("用户不存在!");
        }
        List<SimpleGrantedAuthority> simpleGrantedAuthorities = createAuthorities(user.getRoles());
        return new User(userEntity.getUsername(), userEntity.getPassword(), simpleGrantedAuthorities);
    }

自定义了类之后还要配置才能生效,还是在WebSecurityConfig类中进行配置,参见上文。

原文地址:https://www.cnblogs.com/linyukun/p/9862730.html

时间: 2024-12-11 09:45:32

Spring Security 入门(三)的相关文章

Spring Security 入门(二)

Spring Security 入门(一)中说到,Spring Security执行流程第一步是容器启动时加载系统资源与权限列表,第二步是WEB容器启动时加载拦截器链,并介绍了自定义拦截器的方法.接下来第三步步就是用户登录.介绍下用户登录的流程: 获取用户名和密码,并放入一个 UsernamePasswordAuthenticationToken 实例中(Authentication接口的一个实例); 这个token被传递到一个 AuthenticationManager 实例中进行验证; 若验

Spring Security 3 (三) 用户数据存放于数据库

上章回顾: 上一章中,我们将用户名.密码以及用户对应的角色都配置于applicationContext-security.xml中,基本实现了我们能控制用户的访问权限.但是在现实开发中,我们不可能将用户信息硬编码在配置文件中,通常我们都是存放到数据中.同时我们应该对用户的密码进行加密存储. 目标: 1.将用户信息存放于数据库 2.对用户的密码进行加密 详细操作: 1.其他代码参考上一章中代码.本章中,首先我们要创建一张数据表来记录我们的用户信息.SpringSecurity提供的验证机制中,首先

Spring Security入门

Spring Security入门: http://www.mossle.com/docs/auth/html/index.html Spring Security 默认的过滤器链 https://blog.csdn.net/u013421749/article/details/78626275 原文地址:https://www.cnblogs.com/aligege/p/9396278.html

Spring Security(三)

Spring Security(三) 个性化用户认证流程 自定义登录页面 在配置类中指定登录页面和接收登录的 url @Configuration public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new MyPasswordEncoder(); } @Override protected

Spring Security 入门原理及实战

参考博客: https://www.cnblogs.com/demingblog/p/10874753.html Spring Security 是spring项目之中的一个安全模块,可以非常方便与spring项目无缝集成. 特别是在spring boot项目中加入spring security更是十分简单, 这里就简单介绍一下入门案例和使用原理吧! 写一个简单的springboot测试例子: @Controller public class AppController { @RequestMa

Spring Security入门Demo

一.spring Security简介 SpringSecurity,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权.在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术. 二.建立工程 参考http://blog.csdn.net/haishu_zheng/article/details/51490

Spring Security 入门(1-3)Spring Security oauth2.0 指南

入门 这是支持OAuth2.0的用户指南.对于OAuth1.0,一切都是不同的,所以看它的用户指南. 本用户指南分为两个部分,第一部分是OAuth2.0提供端(OAuth 2.0 Provider),第二部分是OAuth2.0的客户端(OAuth 2.0 Client) OAuth2.0提供端 OAuth2.0的提供端的用途是负责将受保护的资源暴露出去.建立一个可以访问受保护的资源的客户端列表. 提供端是通过管理和验证可用于访问受保护的资源的OAuth 2令牌来做的. 在适当的地方,提供端必须为

Spring Security 入门(1-14)Spring Security 开发指南(转)

开发指南:http://www.cnblogs.com/xingxueliao/p/5911292.html Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际上分为: 授权服务 Authorization Service. 资源服务 Resource Service. 虽然这两个提供者有时候可能存在同一个应用程序中,但在Spring Security OAuth中你可以把 他它们各自放在不同的应用上,而且你可以有多个资源服务,它们共享同一个中央授权服 务

Spring Security入门(2-3)HttpSecurity的使用

到目前为止我们的 SecurityConfig 只包含了关于如何验证我们的用户的信息. Spring Security怎么知道我们想对所有的用户进行验证?Spring Security怎么知道我们需要支持基于表单的验证?原因是我们的SecurityConfig类继承的WebSecurityConfigurerAdapter在configure(HttpSecurity http) 方法提供了一个默认的配置,看起来和下面类似: protected void configure(HttpSecuri