【问题标题】:getting information about the principal获取有关校长的信息
【发布时间】:2013-12-22 18:00:07
【问题描述】:

我有几种方法可以使用此签名来实现宁静的 Web 服务

public @ResponseBody SomeObject someMethodSignature(Principal principal){

鉴于它是遗留代码,有没有一种方法可以从主体获取其他信息(Principal 是来自java.security 的接口,只有一个有用的方法getName()),而不需要传递任何其他信息将方法作为参数?喜欢权限之类的东西?

谢谢

【问题讨论】:

  • 如何改写这个问题以使其有意义? principal 是调用时传递的方法参数,它不是对象。你的意思是“除了类名”吗?如果是这样,当然可以,你可以通过反射来获取该类的完整定义来获取 Principal 类。
  • 你在使用spring security吗?
  • @Taylor:是的,Taylor,spring-security 在里面。
  • @Mike'Pomax'Kamermans:恕我直言。 Principal 是来自java.security 的接口,只有一个有用的方法getName()。这对我来说还不够,我想了解一下主体的权限。
  • @dierre 有这些信息,当然。那么您能否更新帖子以明确提及您知道 Principal 是 java.security.Principal 类,并且正在使用安全管理器?

标签: java security jakarta-ee spring-security


【解决方案1】:

如果您使用的是 Spring Security,那么 Principal 对象应该是 Spring Security 的 Authentication 接口的一个实例。请参阅API Javadoc

这意味着您可以强制转换主体并在其上调用getAuthorities 方法,就像这样

((Authentication)principal).getAuthorities();

请注意,HttpServletRequest 的其他与安全相关的方法也被覆盖,因此您也可以更改您的方法以获取请求对象并调用,例如 isUserInRole 方法,如果这符合您的要求。这将避免您必须在类中添加对 Spring Security 的任何依赖。

【讨论】:

    【解决方案2】:

    主体仅带有名称(通常是身份验证基础结构返回的登录名),没有更多信息可获取。但是,您检查JAAS reference,您会发现还有其他类携带诸如 AuthPermission 之类的信息,用于保存标识您的委托人有权使用的内容的名称,因此,我们使用它来激活(通常)菜单选项。

    【讨论】:

      【解决方案3】:

      接口 Principal 不包含很多信息,但实现可能。如TomcatWeblogic,您可以找到更多有趣的信息。

      【讨论】:

        猜你喜欢
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 2019-07-07
        相关资源
        最近更新 更多