java SpringSecurity使用详解

Java Spring Security使用详解

什么是Spring Security?

Spring Security是Spring框架中一个强大的安全管理框架。它提供了一个全面而灵活的安全管理机制,可以让你轻松地管理应用程序中的身份验证、授权和其他安全相关的一切。

Spring Security 的核心概念

Authentication(认证)

Authentication(认证)是指验证用户是否是合法用户的过程。常用的认证方式有用户名密码验证、证书认证、Token认证、OpenID认证等。Authentication(认证)完成之后,系统将会给这个用户颁发一个唯一的授权Token,也就是以后访问时的凭证。

Authorization(授权)

Authorization(授权)是指验证某个已认证用户是否有权进行某个操作或者访问某个资源的过程。常用的授权方式有:基本授权、角色授权、资源授权和基于表达式的授权等。

FilterChain(过滤器链)

FilterChain是指一系列过滤器的集合。在Spring Security中,FilterChain主要是由一些过滤器和Spring Security的过滤器链实现的。整个过滤器链起到的作用类似于Servlet Filter,依次对请求进行预处理和处理,并且可以决定是否将请求继续交给下一个过滤器处理。

SecurityContext(安全上下文)

SecurityContext是指当前用户的安全上下文环境,是一个容器,主要存储了当前用户的身份验证信息及授权信息等。

Spring Security 集成步骤

  1. 添加Spring Security依赖

    xml
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.5.0</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.5.0</version>
    </dependency>

  2. 配置Spring Security

配置文件参考代码:

``` java
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

   @Autowired
   private UserDetailsServiceImpl userDetailsService;

   @Override
   protected void configure(HttpSecurity http) throws Exception {
       http.csrf().disable().authorizeRequests()
               .antMatchers("/", "/home/**","/hello","/css/**","/js/**").permitAll()
               .antMatchers("/admin/**").hasRole("ADMIN")
               .anyRequest().authenticated()
               .and()
               .formLogin().loginPage("/login").permitAll()
               .and()
               .logout().permitAll();
   }

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

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

}
```

这里的配置代码示例中,我们禁用了跨站点请求伪造(CSRF)保护,允许所有用户访问根页(/)及其子集(/home)和静态资源(/css/和/js/),限制只有角色为ADMIN的用户才能访问/admin路径下的页面,而其他请求需要进行身份认证,最后配置默认的登录页面为/login,退出功能为默认。

  1. 自定义UserDetailsService

UserDetailsService是Spring Security中的一个核心接口,提供了从数据源中读取用户信息的方法。我们需要自定义实现该接口中的loadUserByUsername方法,并将其注入到Spring Security中。

实现代码参考:

``` java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

   @Autowired
   private IUserService userService;

   @Override
   public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
       User user = userService.findByName(username);
       if (user == null) {
           throw new UsernameNotFoundException("用户名不存在:" + username);
       }
       List<GrantedAuthority> authorities = new ArrayList<>();
       if (user.getRole() != null) {
           authorities.add(new SimpleGrantedAuthority(user.getRole().getName()));
       }
       return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(), authorities);
   }

}
```

在该自定义的UserDetailsService实现代码中,我们查询数据库中的用户信息和角色信息,并通过SimpleGrantedAuthority创建GrantedAuthority列表,最后创建Spring Security中内置的User对象返回。

  1. 配置Spring Security 对静态资源的访问权限

    静态资源是指一些HTML、CSS、JS等文件,这些文件不需要通过Spring MVC来进行响应,而是直接由Web服务器进行响应的。当我们使用Spring Security时,需要对这些静态资源进行访问控制。

    注册对静态资源的安全过滤器:

    ``` java
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private CustomResourceSecurityInterceptor customResourceSecurityInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customResourceSecurityInterceptor)
                .addPathPatterns("/css/**", "/js/**");
    }
    

    }
    ```

    注册安全拦截器:

    ``` java
    @Component
    public class CustomResourceSecurityInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        boolean isAllow = false;
        if (request.getRequestURI().startsWith("/css/") || request.getRequestURI().startsWith("/js/")) {
            isAllow = true;
        }
        if (!isAllow) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
        return isAllow;
    }
    

    }
    ```

    所有的静态资源都保存在了Web项目的根目录下的/css/和/js/目录下面,根据这样一个规则,我们便可以通过request.getReuqestURI()判断出来该请求是不是静态资源,从而进行拦截处理。我们可以根据自己实际的应用场景,对相关代码进行调整和完善。

示例1:基于HTTP Basic认证的实现

HTTP Basic认证是基于用户名和密码进行简单的身份验证。

示例代码:

@EnableWebSecurity
public class HttpBasicSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/hello").authenticated()
                .anyRequest().permitAll()
                .and()
                .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
                .and()
                .withUser("admin").password(passwordEncoder().encode("password")).roles("ADMIN");
    }

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

在这里,我们加入了两个用户(user和admin),并给了他们不同的角色。这里我们使用了BCryptPasswordEncoder加密算法对用户的密码进行了加密。而且我们定义了访问/hello路径的所有请求都需要经过身份验证才能访问。

示例2:基于表单登录认证的实现

表单登录认证是指用户在登录时输入用户名和密码进行身份验证。

示例代码:

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class FormAuthenticationConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().loginPage("/login").permitAll()
                .and().logout().permitAll();
    }

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

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

在这里,我们通过@EnableGlobalMethodSecurity(securedEnabled = true)开启了secured的注解支持。并且还添加了登录页面的路径为"/login",和退出的路径为"/logout"。

这两个示例代码展示了如何在Spring Security中实现基本认证方式和表单登录认证,两个示例有着显著的差别,但是目的都是达到同一个目标:安全控制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java SpringSecurity使用详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java CompletableFuture 异步超时实现深入研究

    《Java CompletableFuture 异步超时实现深入研究》介绍了如何通过 CompletableFuture 类实现异步操作的超时控制,通过本文可以深入了解 CompletableFuture 的超时机制,并实现项目开发中常用的异步超时场景。 本文包含以下内容: 1. CompletableFuture 简介 在Java 8中,引入了 Compl…

    Java 2023年5月27日
    00
  • 细致解读希尔排序算法与相关的Java代码实现

    细致解读希尔排序算法与相关的Java代码实现 算法介绍 希尔排序(Shell Sort)是插入排序的一种高效的改进算法,也称作缩小增量排序,通过设定一个增量序列来先进行一定量的插入排序,然后逐步减小增量,最后增量为1时再进行一次插入排序,从而达到排序的效果。 希尔排序的过程如下: 设定一个增量序列(如:{1,3,7,15,…}),对于序列进行遍历; 对于…

    Java 2023年5月26日
    00
  • SpringBoot应用jar包启动原理详解

    SpringBoot应用jar包启动原理详解 Spring Boot是一个快速构建Spring应用程序的框架,它提供了许多便利的功能,例如自动配置、嵌入式Web服务器和健康检查等。在本文中,我们将详细讲解Spring Boot应用jar包的启动原理。 Spring Boot应用jar包的结构 在Spring Boot应用程序中,jar包是一个非常重要的组成部…

    Java 2023年5月15日
    00
  • SpringBoot整合Sharding-JDBC实现MySQL8读写分离

    下面我将详细讲解如何使用SpringBoot整合Sharding-JDBC实现MySQL8读写分离的过程,包括环境搭建、配置文件编写、代码实现和示例说明等: 一、环境搭建 使用MySQL8搭建读写分离环境并创建两个数据库:sharding_db_0和sharding_db_1,分别对应写库和读库。 在maven中引入Sharding-JDBC和相关依赖: x…

    Java 2023年6月16日
    00
  • SpringBoot+微信小程序实现文件上传与下载功能详解

    Spring Boot + 微信小程序实现文件上传与下载功能详解 简介 本文将介绍如何通过微信小程序和 Spring Boot 实现文件上传和下载的功能。其中,文件上传使用到了微信小程序的 wx.uploadFile 方法,文件下载使用到了 ResponseEntity<Resource> 和 ByteArrayResource。 项目准备 Sp…

    Java 2023年5月23日
    00
  • JDBC中使用Java8的日期LocalDate和LocalDateTime操作mysql、postgresql

    下面是“JDBC中使用Java8的日期LocalDate和LocalDateTime操作MySQL、PostgreSQL”的完整攻略。 1. 前置条件 在进行Java8日期类型和JDBC的整合之前,需要保证以下条件: 本地系统已经正确安装MySQL或PostgreSQL数据库,在本次攻略中以MySQL为例。 本地系统已经正确配置好JDBC,以确保Java程序…

    Java 2023年5月20日
    00
  • eclipse修改maven仓库位置的方法实现

    下面我将为您详细讲解“eclipse修改maven仓库位置的方法实现”的完整攻略。 什么是 Maven仓库 Maven是Java项目构建的一种强大工具,而Maven仓库则是Maven的核心功能之一。它是一个本地或远程的存储库,用于存储项目构建所需的依赖库和插件库。够通过Maven仓库中的Jar包来解决项目中的依赖关系,从而完成项目构建。 修改Maven仓库位…

    Java 2023年5月19日
    00
  • Java项目实战之在线考试系统的实现(系统介绍)

    Java项目实战之在线考试系统的实现(系统介绍) 系统功能介绍 在线考试系统是一款基于Java语言开发的在线考试工具,旨在为教师提供创建、管理在线考试的便利。系统主要功能包括: 用户管理:支持管理员添加、修改和删除用户,用户身份分为管理员、教师和学生三种。 考试管理:支持管理员和教师创建、修改和提供考试安排,同时学生可在规定时间内参加考试。 题库管理:管理员…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部