下面是 “SpringBoot 整合Security权限控制的初步配置”的完整攻略,包含了基础概念、示例程序与注意事项。
1. 简介
-
Spring Security 是一个安全框架,提供了认证、授权、攻击防护等一系列的安全功能,是目前比较流行的开源 Java 安全框架之一。
-
Spring Security 采用基于过滤器的方式实现安全控制,对 URL 进行拦截,基于角色、用户认证等更为复杂的信息,进行权限判断。
-
Spring Security 在 Spring Boot 中的整合非常简单,只需要引入关于 Spring Security 的依赖即可。
2. 简单示例
2.1 创建一个 Spring Boot 应用,并引入 spring-boot-starter-security 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.2 禁用 CSRF
默认情况下,Spring Security 会启用 CSRF 防御。可以在应用程序配置类中禁用:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}
2.3 配置用户
Spring Security 提供了一个在内存中定义认证用户的功能。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 定义认证用户的功能,在内存中配置用户的账号、密码、角色。
* @param auth
* @throws Exception
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN");
}
}
通过上述代码可以在内存中配置一个用户名为 admin,密码为 123456,角色为 ADMIN 的用户。
2.4 测试
现在运行应用程序,在浏览器中打开链接 http://localhost:8080,会发现 403 错误。这是因为访问受限,需要进行身份验证。
在弹出的登录框中输入刚刚配置的用户名和密码进行登录。接下来访问 http://localhost:8080 将会直接报错,因为您没有访问该页面的权限。
如果访问 http://localhost:8080/hello,则会出现“Hello World!”的提示信息。这是因为访问 /hello 路径的页面不属于受限资源。
3. 复杂示例
上述示例中,我们配置了一个简单的用户名密码认证,现在我们将配置更复杂的例子:用户使用用户名和密码进行身份验证,如果验证成功,则跳转到首页。如果验证失败,则将其重定向到错误页面。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 数据库授权
*/
@Autowired
private UserService userService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userService)
.passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin().loginPage("/login")
.and()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.logout().permitAll();
}
}
上述代码中,我们使用 userService
加载用户并加密密码。接下来我们配置了 /login 的登录页面并将其提供给所有人。我们还配置了任何需要验证的请求,必须具有身份验证。我们还允许注销操作,并且任何人都可以执行此操作。
我们还可以实现 UserService 的代码来自定义欲授权的用户:
@Service
public class UserServiceImpl implements UserDetailsService {
/**
* 此处主要为了便于演示,所以将用户密码直接写在代码中。
* 当然,在实际项目开发中,我们会通过注册功能注册用户,然后将用户的加密后的密码存入数据库中。
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Collection<GrantedAuthority> authorities = new ArrayList<>();
if ("admin".equals(username)) {
authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new User("admin", new BCryptPasswordEncoder().encode("123456"), authorities);
}
throw new UsernameNotFoundException("用户名不存在!");
}
}
UserService 中的 UserDetails
对象是 Spring Security 中用于存储用户信息的对象,其中包含了用户认证信息和授权信息。
4. 注意事项
Spring Security 的整合不局限于此,此处仅为初步配置过程的简述。
-
默认情况下,Spring Security 在所有 URL 上启用了 CSRF 防御。在页面上使用 CSRF token,或者在 Spring Security 中禁用 CSRF 防御。
-
默认情况下,Spring Security 具有防止会话固定漏洞的功能。这意味着每次登录成功后,会话 ID 会被更改。如果您的应用程序需要允许来自相同 IP 地址的串行用户,则可能需要禁用此保护。
-
匹配通配符时
/**
表示任意路径,而/*
表示单层路径,例如 /foo/* 将匹配 /foo/bar,但是不匹配 /foo/bar/baz。 -
本文中提到的示例代码为了方便说明信息的整合过程,违背了最佳实践中加密算法不应该加在 Java 代码中使用的原则,实际项目中请勿这样使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 整合Security权限控制的初步配置 - Python技术站