在application.properties中引用${user.id}
时间: 2024-02-09 18:09:55 浏览: 126
在application.properties中引用${user.id}的方法非常简单。你只需要使用${user.id}来引用该变量即可。
例如,如果你想要设置一个名为“user.queue.${user.id}”的队列,你可以这样写:
```
my.queue=user.queue.${user.id}
```
这里,${user.id}是一个变量,它的值可以在运行时动态地设置。具体的值可以通过Spring Security等方式获取,你可以根据实际需求来设置它的值。例如,在Spring Security中,你可以使用以下代码来获取当前用户的ID:
```
Long userId = getCurrentUserId();
```
然后,你可以将userID设置为全局变量,如上面的回答所示,然后在application.properties中引用该变量。这样,每个用户都会有一个唯一的队列名,用于接收属于该用户的消息。
相关问题
application.properties中配置${user.id}怎么设置值
可以通过在Spring Security中获取当前用户的ID,并将其存储在Spring的全局变量中,然后在application.properties中引用该变量来设置${user.id}的值。
以下是一个示例:
1. 创建一个Spring Security配置类:
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// ...
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
// ...
}
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Bean
public ServletContextInitializer servletContextInitializer() {
return servletContext -> servletContext.addListener(requestContextListener());
}
@Bean
public CurrentUserHandlerMethodArgumentResolver currentUserHandlerMethodArgumentResolver() {
return new CurrentUserHandlerMethodArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(currentUserHandlerMethodArgumentResolver());
}
}
```
2. 创建一个用于存储当前用户的全局变量:
```
public class CurrentUser {
private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void set(Long userId) {
threadLocal.set(userId);
}
public static Long get() {
return threadLocal.get();
}
public static void remove() {
threadLocal.remove();
}
}
```
3. 创建一个用于获取当前用户ID并将其存储在全局变量中的解析器:
```
public class CurrentUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(Long.class) && parameter.hasParameterAnnotation(CurrentUserId.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return CurrentUser.get();
}
@EventListener
public void handleAuthenticationSuccessEvent(AuthenticationSuccessEvent event) {
CurrentUser.set(event.getUser().getId());
}
@EventListener
public void handleLogoutSuccessEvent(LogoutSuccessEvent event) {
CurrentUser.remove();
}
}
```
4. 在application.properties中引用${user.id}:
```
my.queue=user.queue.${currentUser}
```
这里使用了一个名为“currentUser”的变量,它的值是通过CurrentUserHandlerMethodArgumentResolver获取的当前用户ID。要使用该变量,也需要在MyMessageListener中添加一个参数:
```
@Component
public class MyMessageListener {
@RabbitListener(queues = "${my.queue}")
public void handleMessage(String message, @Value("${currentUser}") Long userId) {
System.out.println("Received message: " + message + " for user " + userId);
}
}
```
这样,你就可以通过${user.id}设置当前用户的队列名称,并在MyMessageListener中获取当前用户的ID。
在Spring Security中配置用户认证和授权,配置文件可以放置在application.properties或application.yml文件中
。在application.properties文件中,可以使用以下配置:
```
# basic authentication
spring.security.user.name=user
spring.security.user.password=password
# jdbc authentication
spring.datasource.url=jdbc:mysql://localhost:3306/dbname
spring.datasource.username=username
spring.datasource.password=password
spring.queries.users-query=select username,password,enabled from users where username=?
spring.queries.roles-query=select u.username, r.name from users u inner join user_role ur on(u.id=ur.user_id) inner join roles r on(ur.role_id=r.id) where u.username=?
```
在application.yml文件中,可以使用以下配置:
```
# basic authentication
spring:
security:
user:
name: user
password: password
# jdbc authentication
spring:
datasource:
url: jdbc:mysql://localhost:3306/dbname
username: username
password: password
security:
user:
name: user
password: password
jdbc:
users-by-username-query: select username,password,enabled from users where username=?
authorities-by-username-query: select u.username, r.name from users u inner join user_role ur on(u.id=ur.user_id) inner join roles r on(ur.role_id=r.id) where u.username=?
```
阅读全文