springboot项目是怎么Authorization认证的
时间: 2024-04-13 15:26:54 浏览: 19
在Spring Boot项目中进行身份认证(Authorization)通常有多种方式可供选择。以下是一些常见的身份认证方法:
1. 基于用户名和密码的表单认证:用户通过提供用户名和密码来进行身份验证。Spring Security框架提供了内置的支持,可以使用`WebSecurityConfigurerAdapter`配置类来定义认证规则和自定义登录页面。
2. 基于令牌(Token)的认证:用户在每次请求时提供访问令牌,服务端验证令牌的有效性。常见的实现方式有JWT(JSON Web Token)和OAuth 2.0。你可以使用Spring Security OAuth或其他相关库来实现令牌认证。
3. 基于第三方身份提供商(如Google、***
相关问题
springboot项目权限控制分配
Spring Boot项目中的权限控制通常涉及到访问控制和角色管理,这在现代Web应用中是一个关键的安全组件。Spring Security是Spring Boot生态系统中常用的权限控制框架,它提供了强大的功能来实现用户身份验证、授权和会话管理。
1. **身份验证(Authentication)**:Spring Security首先会验证用户提供的凭据,如用户名和密码是否有效。可以通过集成如JWT(JSON Web Tokens)或数据库存储的用户信息来完成这个过程。
2. **授权(Authorization)**:验证通过后,Spring Security会检查用户是否有权限访问特定的资源。这可以通过配置基于注解的方式(@PreAuthorize, @Secured等)或者使用更复杂的策略,如基于角色(Role-based access control, RBAC)或者基于权限(Permission-based access control, PBAC)。
3. **基于角色的权限(RBAC)**:定义用户的角色(如管理员、普通用户等),每个角色关联一组权限。用户因为拥有某个角色而自动获得这些角色的权限。
4. **基于资源的权限(RBAC/RBACLite)**:除了基于角色,还可以直接对资源进行精确的权限分配,如`@GetMapping("/admin")`这样的方法级别的控制。
5. **权限注解**:Spring Security提供了多种注解,如`@PreAuthorize`, `@PostAuthorize`, `@HasAnyAuthority`等,用于在控制器方法上声明权限需求。
6. **权限管理框架**:可以考虑使用第三方库如Spring Cloud Gateway、Oauth2(OAuth 2.0或OAuth 2.0 JWT)进行授权服务的集成。
相关问题:
1. 如何在Spring Boot中启用Spring Security?
2. Spring Security支持哪些身份验证和授权模式?
3. Spring Boot如何实现细粒度的资源权限控制?
4. 如何在Spring Security中自定义用户认证过程?
5. Spring Boot如何与第三方权限管理服务集成?
shiro+springboot+jwt项目
Shiro是一个Java安全框架,可以提供身份验证、授权、加密和会话管理等功能,Spring Boot是一个快速开发框架,可以帮助开发人员更快地构建和部署应用程序,JWT(JSON Web Token)是一种轻量级的身份验证和授权机制。将这三个框架结合起来,可以构建一个安全的Web应用程序。
以下是一个简单的Shiro+Spring Boot+JWT项目的实现步骤:
1.创建一个Spring Boot项目,并添加Shiro和JWT依赖项:
```
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.7</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
```
2.创建一个Shiro配置类,配置Shiro的安全策略和过滤器链:
```
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/**", "jwt");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
@Bean
public Realm realm() {
return new UserRealm();
}
@Bean
public JwtFilter jwtFilter() {
return new JwtFilter();
}
}
```
3.创建一个自定义Realm类,实现Shiro的认证和授权逻辑:
```
public class UserRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
User user = (User) principals.getPrimaryPrincipal();
authorizationInfo.addRole(user.getRole());
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException();
}
return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
}
}
```
4.创建一个JwtFilter类,实现JWT的认证逻辑:
```
public class JwtFilter extends AuthenticatingFilter {
@Autowired
private UserService userService;
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String token = httpServletRequest.getHeader("Authorization");
if (StringUtils.isEmpty(token)) {
throw new UnauthorizedException();
}
JwtToken jwtToken = new JwtToken(token);
try {
getSubject(request, response).login(jwtToken);
} catch (AuthenticationException e) {
throw new UnauthorizedException();
}
return true;
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
return false;
}
}
```
5.创建一个JwtToken类,实现JWT的Token逻辑:
```
public class JwtToken implements AuthenticationToken {
private String token;
public JwtToken(String token) {
this.token = token;
}
@Override
public Object getPrincipal() {
return JwtUtils.getSubject(token);
}
@Override
public Object getCredentials() {
return token;
}
}
```
6.创建一个UserController类,实现用户登录和获取用户信息的逻辑:
```
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public Result login(@RequestBody User user) {
String token = userService.login(user);
return Result.success(token);
}
@GetMapping("/user")
public Result getUserInfo() {
User user = (User) SecurityUtils.getSubject().getPrincipal();
return Result.success(user);
}
}
```
7.创建一个UserService类,实现用户登录和生成JWT Token的逻辑:
```
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findByUsername(String username) {
return userMapper.findByUsername(username);
}
public String login(User user) {
User realUser = findByUsername(user.getUsername());
if (realUser == null || !realUser.getPassword().equals(user.getPassword())) {
throw new UnauthorizedException();
}
return JwtUtils.generateToken(realUser.getId(), realUser.getUsername(), realUser.getRole());
}
}
```
8.创建一个JwtUtils类,实现JWT的Token生成和解析逻辑:
```
public class JwtUtils {
private static final String SECRET = "secret";
private static final long EXPIRATION_TIME = 86400000; // 24 hours
public static String generateToken(String id, String username, String role) {
Date now = new Date();
Date expirationDate = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setId(id)
.setSubject(username)
.claim("role", role)
.setIssuedAt(now)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public static String getSubject(String token) {
return Jwts.parser()
.setSigningKey(SECRET)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
```
这样,就可以使用Shiro+Spring Boot+JWT构建一个安全的Web应用程序了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)