一个springboot项目,项目导入了<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId>依赖,由于用户是在微信小程序授权注册,所以数据库默认为每个用户设置初始密码123456,同时项目需要在swagger2页面进行测试,请用java代码和注解实现接口鉴权和PC端的登录接口,请示例代码
时间: 2023-08-14 16:28:28 浏览: 142
SpringBoot2.x 整合Spring-Session实现Session共享功能
好的,针对您的问题,我来给您提供一下解决方案。
首先,针对接口鉴权,可以使用Spring Security的注解进行实现,具体的步骤如下:
1. 在Spring Boot的配置文件中,添加如下配置:
```yaml
spring:
security:
user:
name: admin # 管理员账号
password: 123456 # 管理员密码
```
2. 创建一个SecurityConfig类,用于配置Spring Security的相关参数,代码如下:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/api/**").authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("{noop}123456").roles("ADMIN");
}
}
```
在上面的代码中,我们使用了`@EnableWebSecurity`注解来启用Spring Security,然后重写了`configure(HttpSecurity http)`方法和`configure(AuthenticationManagerBuilder auth)`方法,分别用于配置HTTP安全和用户认证。
在`configure(HttpSecurity http)`方法中,我们使用了`antMatchers("/api/**").authenticated()`来表示只有访问`/api/**`路径的请求才需要认证,其他请求均不需要认证。同时,我们还配置了一个登录页面和一个默认的登录成功后跳转的页面。
在`configure(AuthenticationManagerBuilder auth)`方法中,我们使用了`inMemoryAuthentication()`方法来指定认证用户的方式,然后使用`withUser("admin").password("{noop}123456").roles("ADMIN")`方法来添加一个管理员账号和密码,其中`{noop}`表示使用不加密的密码。
3. 在需要进行接口鉴权的Controller类或者方法上,添加`@PreAuthorize`注解来指定访问该接口的权限,例如:
```java
@RestController
@RequestMapping("/api")
public class ApiController {
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String admin() {
return "Hello admin";
}
@GetMapping("/user")
public String user() {
return "Hello user";
}
}
```
在上面的代码中,我们使用了`@PreAuthorize("hasRole('ADMIN')")`注解来指定只有具有`ADMIN`角色的用户才能访问`/api/admin`接口,其他用户无法访问。
针对PC端的登录接口,可以使用Spring Security的表单登录功能来实现,具体的步骤如下:
1. 创建一个Controller类,用于处理登录相关的请求,代码如下:
```java
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@GetMapping("/home")
public String home() {
return "home";
}
}
```
在上面的代码中,我们创建了一个`/login`接口和一个`/home`接口,分别用于显示登录页面和默认的登录成功后跳转的页面。
2. 创建一个login.html页面,用于显示登录表单,代码如下:
```html
<!DOCTYPE html>
<html>
<head>
<title>Login Page</title>
</head>
<body>
<h3>Login with your username and password</h3>
<form th:action="@{/login}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required autofocus><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required><br><br>
<button type="submit">Login</button>
</form>
</body>
</html>
```
在上面的代码中,我们创建了一个表单,使用`th:action="@{/login}"`来指定表单提交的地址为`/login`接口。
3. 在Spring Security的配置类中,添加如下配置:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login", "/css/**", "/js/**", "/img/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/home")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
```
在上面的代码中,我们添加了一个`UserDetailsService`的自动装配,用于加载用户信息。然后,在`configure(HttpSecurity http)`方法中,我们使用了`antMatchers("/login", "/css/**", "/js/**", "/img/**").permitAll()`来指定登录页面和相关静态资源的访问不需要认证,其他请求均需要认证。然后,我们使用了`formLogin()`方法来启用表单登录功能,使用`loginPage("/login")`来指定登录页面的路径,使用`defaultSuccessUrl("/home")`来指定默认的登录成功后跳转的页面。
在`configure(AuthenticationManagerBuilder auth)`方法中,我们使用了`userDetailsService(userDetailsService)`方法来指定使用`UserDetailsService`加载用户信息,然后使用`passwordEncoder()`方法来指定密码加密方式。
4. 创建一个UserDetailsServiceImpl类,用于实现`UserDetailsService`接口,代码如下:
```java
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if ("admin".equals(username)) {
return new User("admin", "{bcrypt}$2a$10$GZyJYBkO7qEJ6w3iN5HJweBYs8W6pPvzB8tDq3dY5UoQJtI4b3fZm", AuthorityUtils.createAuthorityList("ADMIN"));
} else {
throw new UsernameNotFoundException("User not found");
}
}
}
```
在上面的代码中,我们实现了`UserDetailsService`接口的`loadUserByUsername(String username)`方法,用于根据用户名加载用户信息。在这个例子中,我们只有一个管理员账号,所以如果用户名不是`admin`,则会抛出`UsernameNotFoundException`异常。
在`loadUserByUsername(String username)`方法中,我们使用了`User`类来表示用户信息,其中第二个参数是经过BCrypt算法加密后的密码,使用`AuthorityUtils.createAuthorityList("ADMIN")`来指定用户的角色为`ADMIN`。
综上所述,我们使用了Spring Security的注解和表单登录功能来实现接口鉴权和PC端的登录接口。当然,以上代码只是一个简单的示例,实际应用中还需要根据具体情况进行修改和优化。
阅读全文