java - Orika映射spring的org.springframework.security.core.GrantedAuthority

标签 java spring spring-security orika

我很抱歉用这个问题打扰你,但我最终找到了一个令人头疼的人,我想知道我是否以错误的方式处理这个问题。

我想映射一个包含 org.springframework.security.core.authority.SimpleGrantedAuthority 集合的类这样我就不需要将 ORM 急切地加载的它发送到 Spring 安全类中。但它的“role”属性与 getter“getAuthority”相关联,此时 Orika 意味着麻烦。我可以强制 Orika 使用 getter 返回的值,将其放入目标类的 setter 中吗?

如果您足够关心,这里有一些我的问题的背景。 我正在为应用程序使用 Spring security。我有一项服务返回 org.springframework.security.core.userdetails.UserDetails这样 spring 就可以检查用户是否经过身份验证并且具有权限。我们拥有的 UserDetail 的实现是一个名为 User 的本地实现。 。由于此类实现了 org.springframework.security.core.userdetails.UserDetails ,它有方法 public Collection<? extends GrantedAuthority> getAuthorities();返回该用户的权限。

一切都很好,除了我们有这个 User在数据库中,用 hibernate 处理。第一个选择将开放 session 留在视野中的位置。我们不希望这样。第二个选择是获取 ORM、EARGER。我们也不希望这样。因此,我们决定使用 DTO,实现 UserDetail,并将其映射到 orika。就在那时,一切都崩溃了。 org.springframework.security.core.GrantedAuthority是一个接口(interface)。我们使用的具体类是 org.springframework.security.core.authority.SimpleGrantedAuthority 。这是一个难以映射且致命的类,因为它有一个属性名称“role”,但它的 getter 是“getAuthority”

public String getAuthority() {
    return role;
}

看来 Spring 团队和 Orika 团队并不是很亲密的 friend 。否则,他们会根据 java 标准命名该属性,而 Orika 会直接映射它。我也不愿意为这种特殊情况定义自定义映射器,这正是困扰我的问题。除了用特定类的自定义映射器替换所有“魔法”之外,是否有任何已知的方法可以强制 Orika 使用 getter 方法返回的值?

最佳答案

好吧,最终,像我一样固执是值得的:)

我解决了有问题的问题,而无需诉诸任何技巧。干扰我的映射的问题是 getter 返回的集合的泛型。你会发现,orika 似乎无法处理以下映射...至少,我不知道。

public List<? extends GrantedAuthority> getAuthorities() {
    return this.role;
}

我把它改成了

public List<GrantedAuthority> getAuthorities() {
    return this.role;
}

并且工作得很好!

非常感谢您的时间和关注!

关于java - Orika映射spring的org.springframework.security.core.GrantedAuthority,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20366871/

相关文章:

java - 在java中调用webservice时出现"org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected..."错误

java - 找不到全局 web.xml

java - Spring boot 中依赖关系不满足异常

java - Hibernate从数据库获取已删除的java枚举类型

java - Spring Security SAML,当使用 SAMLContextProviderLB 设置为 HTTPs 方案时重定向到 HTTP 而不是 HTTPS

java - 与 ^.*(?=.*\\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&]).*$ 匹配的单词

java - 如何在android中以编程方式设置相等的列宽大小

java - Spring 集成邮件轮询器

java - Spring access-denied-handler 可以引用弹出窗口吗?

java - Spring Security - 从数据库中获取当前用户字段