访问认证数据
如何在服务器端访问认证数据,以及如何将数据传输到客户端。
尽管授权是在端点级别定义的(如Security 页面所述),您可能需要在端点 Java 代码或客户端代码中了解特定的认证参数。
此页面解释了如何在服务器端访问认证数据(例如用户名和角色),以及如何将这些数据传输到客户端。
服务器端访问
安全主体(Security Principal)
Hilla 验证每个服务器请求,如果认证成功,则将请求与 Java 安全主 体(principal)相关联。您可以通过当前请求以[classname]UserPrincipal`形式获得认证用户。您可以使用 [methodname]`VaadinRequest.getCurrent() 获取当前请求。对请求调用 getUserPrincipal() 会返回经过认证的用户,如果请求未经认证则返回 null。
Source code
EchoEndpoint.java
EchoEndpoint.java@Endpoint
public class EchoEndpoint {
@PermitAll
public String saySomething(String message) {
return VaadinRequest.getCurrent().getUserPrincipal().getName() + " says: " + message;
}
}frontend/index.ts
frontend/index.ts客户端认证
检查用户名
在 TypeScript 中,没有直接方式来检查用户是否已认证。不过,您可以公开一个服务器端端点,用于检查用户权限并返回状态。
下一个示例在用户登录时返回用户名,否则返回单词 anonymousUser:
Source code
Java
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
@Endpoint
public class MyAppEndpoint {
@AnonymousAllowed
public String checkUser() {
Authentication auth =
SecurityContextHolder.getContext().getAuthentication();
return auth == null ? null : auth.getName();
}
}Source code
TypeScript
import { MyAppEndpoint } from 'Frontend/generated/MyAppEndpoint';
const username = await MyAppEndpoint.checkUser();
if ('anonymousUser' === username) {
console.log('You are an anonymous user');
} else {
console.log('Your username is: ' + username);
}检查角色
开发人员可能希望检查用户是否可以访问特定服务,以便在应用程序菜单中启用合适的选项。
以下示例公开了一个检查用户是否为管理员的方法:
Source code
Java
@Endpoint
public class MyAppEndpoint {
@RolesAllowed("ROLE_ADMIN")
public boolean isAdmin() {
return true;
}
}Source code
TypeScript
import { MyAppEndpoint } from 'Frontend/generated/MyAppEndpoint';
const isAdmin = await MyAppEndpoint.isAdmin().catch(() => false);
if (isAdmin) {
console.log('You are an admin user');
} else {
console.log('Sorry, you are not an admin user');
}