安全框架
在java开发领域,常见的安全管理框架有apache shiro和spring security。shiro是相对spring security是轻量级的,提供了认证、授权,会话管理,密码管理、缓存管理等功能,spring security相对复杂点,功能比shiro更加强大,权限控制可以更精细,对OAuth2的支持也更友好,与spring框架无缝整合
spring security
简单用法
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- 必须引入starter-web 否则不是web项目,不可能localhost:8080访问,连错误页面都没有-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
登录页面
访问 http://localhost:8080,出现了security的登录页面,不管是什么URL都跳登录,默认用户名是user,默认密码是每次启动项目随机生成
// 启动时,生成随机密码
Using generated security password: 6a83bc58-fad7-4a16-94a3-9bd73d6a2f2f
如果不想使用随机密码,可以在yml中配
spring:
security:
user: # 如果有了基于内存的认证,则此处配置不生效
name: admin
password: admin
roles: admin
postman访问成功
基于内存的认证
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance(); //如果没有的话,会报java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception { //这是基于内存的配置,则yml中配置的不生效
auth.inMemoryAuthentication()
.withUser("admin3").password("admin3").roles("ADMIN", "USER")
.and()
.withUser("user").password("123").roles("USER");
}
}
如果你发现访问任何页面,都出现了上面的登录页面,八成是引入了security,删除security即可解决,如果是因为其他的依赖引入了security,就不太好删除了,这时,下面的配置类可以解决,重写 WebSecurityConfigurerAdapter即可
@Configuration
public class SecurityConfig {
@Bean
public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() {
return new WebSecurityConfigurerAdapter() {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().permitAll();
}
};
}
}