Spring Security集成以及配置
挺多的。。。就直接放上来吧,就不解释什么了。反正有注释。
为的是有一天要用、但是忘了相关的配置可以看这篇文章想起来。
由于使用security配置,故不需要Redis储存session了,将此相关的全部去掉
yml:
#数据库连接属性配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hospital?serverTimezone=Asia/Shanghai username: root password: 614 #security配置 jackson: serialization: indent_output: true #mybatis实体类名 mybatis: type-aliases-package: top.yibobo.hospital.domain configuration: #到下划线的表字段自动映射成驼峰命名法 map-underscore-to-camel-case: true mapper-locations: classpath:mybatis/mapper/*.xml #设置服务器端口号/session保存时长 server: port: 8086 #定义日志文件路径 logging: file: logs/all.log level: org.springframework.security: info
pom.xml要加的:
<!--security配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
package top.yibobo.hospital.security.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import top.yibobo.hospital.domain.Authority; import java.util.Collection; import java.util.Date; import java.util.List; /* Spring Security框架服务的用户类 */ public class JwtUser implements UserDetails { private final Integer id;//必须 private final String username;//必须 private final String password;//必须 private final Integer state; private final String email; private final Date lastPasswordResetDate; private final boolean enabled;//必须 private final Date loginTime; //授权的角色集合 private final Collection<? extends GrantedAuthority> authorities;//必须 public JwtUser(Integer id, String username, String password, Integer state, String email, Date lastPasswordResetDate, boolean enabled, Date loginTime, Collection<? extends GrantedAuthority> authorities) { this.id = id; this.username = username; this.password = password; this.state = state; this.email = email; this.lastPasswordResetDate = lastPasswordResetDate; this.enabled = enabled; this.loginTime = loginTime; this.authorities = authorities; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { return this.authorities; } @JsonIgnore @Override public String getPassword() { return this.password; } @Override public String getUsername() { return this.username; } @JsonIgnore @Override public boolean isAccountNonExpired() { return true; } @JsonIgnore @Override public boolean isAccountNonLocked() { return true; } @JsonIgnore @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return this.enabled; } @JsonIgnore public Integer getId() { return id; } public Integer getState() { return state; } public String getEmail() { return email; } @JsonIgnore public Date getLastPasswordResetDate() { return lastPasswordResetDate; } public Date getLoginTime() { return loginTime; } }
package top.yibobo.hospital.security.domain; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import top.yibobo.hospital.domain.Admins; import top.yibobo.hospital.domain.Authority; import java.util.List; import java.util.stream.Collectors; public final class JwtUserFactory { private JwtUserFactory(){} public static JwtUser create(Admins user){ return new JwtUser(user.getAid(), user.getAname(), user.getPwd(), user.getState(), user.getEmail(), user.getLastPasswordResetDate(), user.getAexist()==1?true:false, user.getLoginTime(), mapToGrantedAuthorities(user.getAuthorities())); } /* 将查询的用户角色集合转化为security框架授权的角色集合 */ private static List<GrantedAuthority> mapToGrantedAuthorities(List<Authority> authorities){ return authorities.stream().map(authority -> new SimpleGrantedAuthority(authority.getName().name())) .collect(Collectors.toList()); } }
package top.yibobo.hospital.security.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import top.yibobo.hospital.domain.Admins; import top.yibobo.hospital.mapper.AdminsMapper; import top.yibobo.hospital.security.domain.JwtUserFactory; @Service public class JwtUserDetailsService implements UserDetailsService{ @Autowired private AdminsMapper adminsMapper; @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { Admins user = adminsMapper.findByName(s); if(user==null){ throw new UsernameNotFoundException("找不到用户呀呀呀呀呀呀呀呀!!!!"); }else { return JwtUserFactory.create(user); } } }
package top.yibobo.hospital.security.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; /** * 安全配置类 * 配置哪些请求要经过安全检查 * */ @SuppressWarnings("SpringJavaAutowiringInspection") @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired @Qualifier("jwtUserDetailsService") private UserDetailsService userUserDetailsService; @Autowired public void configureAuthentication(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception { authenticationManagerBuilder .userDetailsService(this.userUserDetailsService) .passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity httpSecurity) throws Exception { //安全配置 httpSecurity // we don't need CSRF because our token is invulnerable .csrf().disable() // don't create session .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() //.antMatchers(HttpMethod.OPTIONS, "/**").permitAll() // allow anonymous resource requests .antMatchers( HttpMethod.GET, "/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.css", "/**/*.js" ).permitAll() // 不需要进行安全效验的请求 .antMatchers( "/auth/**", "/api/users", "/api/testError" ).permitAll() // 其他api请求都必须做安全效验 .anyRequest().authenticated(); // disable page caching httpSecurity .headers() .frameOptions().sameOrigin() // required to set for H2 else H2 Console will be blank. .cacheControl(); } }
1 COMMENT