springboot 检验用户时候有该接口的权限 功能设计代码
时间: 2024-03-08 22:47:49 浏览: 76
以下是一个简单的Spring Boot代码示例,用于检验用户是否有访问某个接口的权限:
1. 配置Spring Security
在Spring Boot的配置类中,添加以下配置来启用Spring Security和方法级别的权限验证:
```java
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
}
}
```
以上配置中,我们配置了一个UserDetailsService对象来检索用户信息和权限信息,并使用BCryptPasswordEncoder对象来加密密码。同时,我们启用了方法级别的权限验证,并定义了一个HTTP Basic认证方式,即用户需要在请求头中带上用户名和密码才能访问受保护的接口。
2. 配置方法级别的权限验证
在需要进行权限验证的Controller类或方法上,使用注解@PreAuthorize或@PostAuthorize来标记需要的权限。例如,我们可以在Controller类上使用以下注解来限制只有角色为ROLE_ADMIN的用户才能访问该Controller类提供的接口:
```java
@RestController
@RequestMapping("/api")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class ApiController {
@GetMapping("/foo")
public String foo() {
return "bar";
}
}
```
以上代码中,我们使用了@PreAuthorize注解来指定需要的权限,即只有ROLE_ADMIN角色的用户才能访问该接口。
3. 实现UserDetailsService接口
我们需要实现UserDetailsService接口来检索用户信息和权限信息。以下是一个简单的实现示例:
```java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
}
List<GrantedAuthority> authorities = new ArrayList<>();
for (Role role : user.getRoles()) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);
}
}
```
以上代码中,我们使用UserRepository对象来检索用户信息,并将用户信息和角色信息封装到一个UserDetails对象中返回。在UserDetails对象中,我们使用SimpleGrantedAuthority对象来表示用户的角色信息。
4. 配置角色信息
在数据库中,我们需要定义角色信息。例如,我们可以定义一个role表,用于存储角色信息:
```sql
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `role` (`id`, `name`) VALUES (1, 'ROLE_USER');
INSERT INTO `role` (`id`, `name`) VALUES (2, 'ROLE_ADMIN');
```
在User表中,我们可以使用一个外键关联Role表,表示用户的角色信息。例如:
```sql
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(100) NOT NULL,
`enabled` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_role` (
`user_id` int(11) NOT NULL,
`role_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`role_id`),
KEY `fk_role_id` (`role_id`),
CONSTRAINT `fk_role_id` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
以上代码中,我们使用user_role表来表示用户和角色之间的关系。每个用户可以有多个角色,因此user_role表中的(user_id, role_id)组合是唯一的。
阅读全文