Java Spring Security认证与授权及注销和权限控制篇综合解析
什么是Java Spring Security?
Spring Security是一个基于Spring框架的安全性框架,目的是为了帮助开发者构建安全性的应用。它提供了诸如认证,授权,攻击防御等安全特性。
认证
Spring Security 认证提供了选择、实现不同的认证方式。本节介绍三种常见的认证方式。
基本认证
基本认证是最简单的认证方式。客户端发起请求时,在“Authorization”头部传递Base64字符串,该字符串是由“username:password”组成,即用户名和密码,服务器根据该字符串来鉴别请求的合法性。
使用Spring Security实现基本认证:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
表单认证
表单认证是Web应用中常见的认证方式。客户端在表单中填写用户名和密码,绑定提交,服务器端验证用户名和密码的正确性。
使用Spring Security实现表单认证:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() // 禁用 CSRF
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login") // 登录页面
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
OAuth2.0认证
OAuth2.0是一种认证和授权标准,在应用程序中广泛使用。通过OAuth2.0认证,用户可以使用第三方服务进行登录。使用OAuth2.0认证需要调用第三方API,获取OAuth Token。
使用Spring Security实现OAuth2.0认证:
@Configuration
@EnableWebSecurity
@EnableOAuth2Sso
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login();
}
}
授权
Spring Security 提供了丰富的授权方式,可以提供诸如基于角色、基于权限、ACL等授权特性,可满足各种复杂的授权需求。
基于角色授权
基于角色的授权是指用户通过分配角色来完成授权。系统管理员可以为用户分配角色,用户可以根据自己权限进行操作。
使用Spring Security实现基于角色的授权:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
基于权限授权
基于权限的授权是指用户通过分配权限来完成授权。系统管理员可以为用户分配权限,用户可以根据自己权限进行操作。
使用Spring Security实现基于权限的授权:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasAuthority("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
注销
注销是将当前用户从系统中退出,Spring Security 提供了注销的实现。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutUrl("/logout") // 注销URL
.logoutSuccessUrl("/login") // 注销成功跳转URL
.invalidateHttpSession(true)
.deleteCookies()
.permitAll();
}
权限控制
Spring Security 还提供了许多其他的功能,例如:权限控制、攻击防御等。
访问控制
对某些资源的访问进行控制,例如:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
CSRF防护
Spring Security 提供了CSRF防护来防护跨站请求伪造攻击,可以使用csrf().disable()禁用CSRF。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() // 禁用CSRF
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.permitAll();
}
以上是Spring Security 认证与授权及注销和权限控制篇综合解析。
示例
基本认证
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
}
使用curl工具请求:
curl --user user:password http://localhost:8080/hello
OAuth2.0认证
@SpringBootApplication
@RestController
@EnableOAuth2Sso
public class ClientApplication {
@GetMapping("/")
public String index(Principal principal) {
return "Hello, " + principal.getName();
}
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
spring:
security:
oauth2:
client:
registration:
google:
client-id: ***
client-secret: ***
scope:
- email
- profile
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
token-uri: https://www.googleapis.com/oauth2/v4/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
user-name-attribute: name
请求:
浏览器中访问:http://localhost:8080/
可以看到授权页面,确认授权,成功后会返回页面显示用户信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Spring Security认证与授权及注销和权限控制篇综合解析 - Python技术站