spring boot整合spring security,springboot security详解

  spring boot整合spring security,springboot security详解

  00-1010前言配置取决于用户配置1。内存用户存储2。数据库用户存储3。LDAP用户存储4。自定义用户存储拦截配置。

  00-1010选框最常用的选择是在Spring security和shiro之间选择。Spring security和Shiro一样,有权限管理的认证、授权、加密等功能。但是对于Springboot来说,春安比Shiro更适合。都是Spring生态的内容,在使用中,Spring boot只需要引入安全就可以实现基本的登录验证。

  00-1010 Spring Boot的相关版本:2.7.1

  groupidorg . spring framework . boot/groupidartifidspring-boot-starter-parent/artifact id version 2 . 7 . 1/versionrelativepath//parent添加的安全性的依赖版本是:2.6.7

  Dependencygroupidol。spring framework . boot/groupid artifactspring-boot-starter-security/artifactid version 2 . 6 . 7/version/dependency。因此,安全性是简单集成的。现在,当您启动access项目时,您将直接看到一个登录页面。

  这种安全性是简单登录的实现。官方默认账号是user,密码会打印在启动控制台。下图中的密码就是密码。

  这个密码会在每次启动时随机生成,也可以在配置文件中指定,代码会添加到配置文件中。

  spring:安全:用户:名称:管理员密码: 123456角色:管理员

  重启项目,此时设置好账号密码。当然,单凭这一点肯定达不到我们的权限要求。下面是如何配置我们的具体权限。

  00-1010要实现自定义配置,首先创建一个继承自WebSecurityConfigurerAdapter的配置类,实现configure方法,这是自定义实现权限的逻辑。

  @ Configuration @ EnableWebSecuritypublic class Security config扩展WebSecurityConfigurerAdapter { @ Override protected void configure(AuthenticationMan Ager Builder Auth)抛出异常{}} @ EnableWebSecurity批注,Spring Security使用它来启用web安全。

  配置Spring Security的用户存储地址有四种方法。

  内存存储数据库用户存储LDAP用户存储自定义用户存储

  00-1010这种存储方式在程序里写死了。启动时,用户权限集被初始化。优点是速度快。因为是基于内存的,缺点是不灵活,不能动态改变权限,不能注册,所以我们基本不用这种方式。

  重写configure方法后,启动观看效果,在登录页面可以通过这两个账号登录。

  @ Configuration @ EnableWebSecuritypublic class security config扩展WebSecurityConfigurerAdapter { @ Override protected void configure(AuthenticationMan ager builder auth)引发异常{ auth.inMemoryAuthentication()。密码编码(密码

  ncoder()) .withUser("admin").password(passwordEncoder().encode("123456")).authorities("ADMIN") .and() .withUser("anduoduo").password(passwordEncoder().encode("123456")).authorities("ORDINARY"); } private PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }}

 

  

2.数据库用户存储

用户权限放在数据库中是我们最常用的方式,这样可以让我们可以很方便地对用户信息进行增删改查。并且还可以为用户添加除认证信息外的附加信息。

 

  

@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private DataSource dataSource; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder()) .usersByUsernameQuery( "select username, password, status from Users where username = ?") .authoritiesByUsernameQuery( "select username, authority from Authority where username = ?"); } private PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }}

auth调用jdbcAuthentication()来告诉Spring Security使用jdbc的方式来查询用户和权限,dataSource()方法指定数据库连接信息,passwordEncoder()指定密码加密规则,用户的密码数据应该以同样的方式进行加密存储,不然,两个加密方式不同的密码,匹配补上。usersByUsernameQuery()和authoritiesByUsernameQuery()方法分别定义了查询用户和权限信息的sql语句。

 

  

 

  

3.LDAP用户存储

这种方式很少见应该,LDAP是一个文件协议,这种方式就是通过获取文件来做权限内容,之前log4j出现的被侵入bug就是因为这一部分,可以通过LDAP进行代码执行。

 

  

@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> configurer = auth.ldapAuthentication() .userSearchBase("ou=people") .userSearchFilter("(uid={0})") .groupSearchBase("ou=groups") .groupSearchFilter("member={0}"); configurer.passwordCompare() .passwordEncoder(passwordEncoder()) .passwordAttribute("passcode"); configurer.contextSource().url("ldap://xxxxx.com:17099/dc=xxxxxx,dc=com"); } private PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }}

 

  

4.自定义用户存储

自定义用户存储,就是自行使用认证名称来查找对应的用户数据,然后交给Spring Security使用。这种方式需要一个实现UserDetailsService的service类,

 

  

public class UserServiceImpl implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userMapper.getUserByUsername(username); return user == null ? new User() : user; }}

这个实现类只需要实现一个方法:loadUserByUsername()。该方法需要做的是使用传过来的username来匹配一个带有密码等信息的用户实体。User的实体类需要实现UserDetails,因为返回对象是UserDetails,也就是说,查到的信息里,必须得有Spring Security所需要的信息。

 

  

public class User implements UserDetails { @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getPassword() { return null; } @Override public String getUsername() { return null; } @Override public boolean isAccountNonExpired() { return false; } @Override public boolean isAccountNonLocked() { return false; } @Override public boolean isCredentialsNonExpired() { return false; } @Override public boolean isEnabled() { return false; }}

config代码

 

  

@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private MyUserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService) .passwordEncoder(passwordEncoder()); } @Bean private PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }}

这个配置只需要告诉Spring Security的UserDetailsService实现类是哪个就可以了,它会去调用loadUserByUsername()来查找用户。

 

  

 

  

拦截配置

拦截也是同样在SecurityConfig配置类里的configure方法,只不过重载了configure方法

 

  

// 配置安全策略 @Override protected void configure(HttpSecurity http) throws Exception { // 设置路径及要求的权限,支持 ant 风格路径写法 http.authorizeRequests() // 设置 OPTIONS 尝试请求直接通过 .antMatchers(HttpMethod.OPTIONS, "/**").permitAll() .antMatchers("/api/demo/user").hasAnyRole("user", "admin") // 注意使用 hasAnyAuthority 角色需要以 ROLE_ 开头 .antMatchers("/api/demo/admin").hasAnyAuthority("ROLE_admin") .antMatchers("/api/demo/hello").permitAll() .and() // 开启表单登录 .formLogin().permitAll() .and() // 开启注销 .logout().permitAll(); }

到此这篇关于Spring boot整合security详解的文章就介绍到这了,更多相关Spring boot security内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: