Vaadin 14 和 Push:在请求线程外访问 Spring SecurityContext 和 Authentication
Vaadin 14 and Push: Accessing Spring SecurityContext and Authentication outside the request thread
我遇到了这个人遇到的同样问题:
https://vaadin.com/forum/thread/3383122/17008971
从服务器接收状态时,我尝试在客户端通过推送(使用 ui.access)刷新内容。该内容需要现任校长的信息。
final SecurityContext securityContext = SecurityContextHolder.getContext();
final Authentication authentication = securityContext.getAuthentication();
这个
authentication
正在返回 null。
他使用 Vaadin Shared Security 解决了这个问题,但我找不到任何名为 Vaadin Shared Sec 的存储库或库。还有其他方法可以解决这个问题吗?
为什么不直接在视图构造函数中获取身份验证详细信息并使它们具有 class 范围,或者让一个 bean 来执行此操作并设置其值?例如
@Route("some-view")
public class SomeView extends VerticalLayout {
Authentication authentication;
private void doHeavyStuff() {
try {
Thread.sleep(1500);
} catch (InterruptedException ex) {
// ignore
}
}
public SomeView() {
authentication = SecurityContextHolder.getContext().getAuthentication();
final Button button = new Button("Click me", e -> {
Notification.show("CLICKED");
getUI().ifPresent(ui -> {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
doHeavyStuff();
ui.access(() -> {
Notification.show("Calculation done");
});
});
});
});
add(button);
// simple link to the logout endpoint provided by Spring Security
Element logoutLink = ElementFactory.createAnchor("logout", "Logout");
getElement().appendChild(logoutLink);
}
}
我在本教程中基于这个答案(也对其进行了测试),如果您想了解更多信息:
https://vaadin.com/learn/tutorials/securing-your-app-with-spring-security/speciale
我遇到了这个人遇到的同样问题: https://vaadin.com/forum/thread/3383122/17008971
从服务器接收状态时,我尝试在客户端通过推送(使用 ui.access)刷新内容。该内容需要现任校长的信息。
final SecurityContext securityContext = SecurityContextHolder.getContext();
final Authentication authentication = securityContext.getAuthentication();
这个
authentication
正在返回 null。
他使用 Vaadin Shared Security 解决了这个问题,但我找不到任何名为 Vaadin Shared Sec 的存储库或库。还有其他方法可以解决这个问题吗?
为什么不直接在视图构造函数中获取身份验证详细信息并使它们具有 class 范围,或者让一个 bean 来执行此操作并设置其值?例如
@Route("some-view")
public class SomeView extends VerticalLayout {
Authentication authentication;
private void doHeavyStuff() {
try {
Thread.sleep(1500);
} catch (InterruptedException ex) {
// ignore
}
}
public SomeView() {
authentication = SecurityContextHolder.getContext().getAuthentication();
final Button button = new Button("Click me", e -> {
Notification.show("CLICKED");
getUI().ifPresent(ui -> {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
doHeavyStuff();
ui.access(() -> {
Notification.show("Calculation done");
});
});
});
});
add(button);
// simple link to the logout endpoint provided by Spring Security
Element logoutLink = ElementFactory.createAnchor("logout", "Logout");
getElement().appendChild(logoutLink);
}
}
我在本教程中基于这个答案(也对其进行了测试),如果您想了解更多信息: https://vaadin.com/learn/tutorials/securing-your-app-with-spring-security/speciale