0

我有一个弹簧安全 MVC 应用程序。在几个 JSP 文件中,我的代码如下所示:

<sec:authorize access="hasAnyRole('ROLE_FOO', 'ROLE_BAR')">
  <!--do something here-->  
</sec:authorize>

ROLE_FOO将应用程序部署到生产环境时,我必须进行代码更改(更改为其他内容),因为它具有不同的角色名称。所以我想知道是否有一种方法可以在属性文件中配置这些角色名称,然后在<sec:authorize>标签中选择它们。

所以代码看起来像这样:

属性文件:

Admin_Roles = ROLE_FOO ROLE_BAR

和 JSP

<sec:authorize access="hasAnyRole(<get roles from Admin_Roles in prop file>)">
  <!--do something here-->  
</sec:authorize>

顺便说一句,我使用 Active Directory 进行身份验证,因此这些角色已在 Active Directory 中预先配置用于测试和生产。

4

2 回答 2

1

不确定如何为可变数量的角色执行此操作,但对于固定数量的角色,您是否尝试过类似的操作?

JSP:

<sec:authorize access="hasAnyRole('${adminRole1}', '${adminRole2}')">
  <!--do something here-->  
</sec:authorize>

控制器:

@Value("#{myprops.admin_role_1}"}
private String adminRole1;
@Value("#{myprops.admin_role_2}"}
private String adminRole2;
...
@RequestMapping("/hello")
public String hello(final Model model) {
  model.addAttribute("adminRole1", adminRole1);
  model.addAttribute("adminRole2", adminRole2);
  ...
} 

和配置 XML:

<bean id="myprops"
  class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <!-- External property files -->
      <value>file:${somepathvar}/adminroles.properties</value>
    </list>
  </property>
</bean>
于 2013-02-27T03:40:27.213 回答
1

不确定这是最简单的方法。但是您可以编写自己的表达式。

这个链接应该非常有用。关联

由于每个版本之间存在一些差异。您最好看一下源代码,DefaultWebSecurityExpressionHandler以确保在覆盖时不会遗漏任何内容createSecurityExpressionRoot

于 2013-02-27T02:36:49.223 回答