Docs

Documentation versions (currently viewingVaadin 24)
Documentation translations (currently viewingChinese)

此页面是由官方文档(http://vaadin.com/docs)机器翻译而来。翻译可能存在错误、不准确或误述。Vaadin不对翻译的准确性、可靠性或时效性作出任何保证或声明。

访问认证数据

如何在服务器端访问认证数据,以及如何将数据传输到客户端。

尽管授权是在端点级别定义的(如Security 页面所述),您可能需要在端点 Java 代码或客户端代码中了解特定的认证参数。

此页面解释了如何在服务器端访问认证数据(例如用户名和角色),以及如何将这些数据传输到客户端。

服务器端访问

安全主体(Security Principal)

Hilla 验证每个服务器请求,如果认证成功,则将请求与 Java 安全主体(principal)相关联。您可以通过当前请求以[classname]UserPrincipal`形式获得认证用户。您可以使用 [methodname]`VaadinRequest.getCurrent() 获取当前请求。对请求调用 getUserPrincipal() 会返回经过认证的用户,如果请求未经认证则返回 null。

Source code
EchoEndpoint.java
@Endpoint
public class EchoEndpoint {
    @PermitAll
    public String saySomething(String message) {
        return VaadinRequest.getCurrent().getUserPrincipal().getName() + " says: " + message;
    }
}
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');
}