像很多框架或者容器一样,Portlet的安全也可以用声明式或者编程式,这里谈编程式。

PortletRequest 类定义了几个方法和安全有关,用于表示对某个Portlet请求时应用安全设定:

  1. public interface PortletRequest{ 
  2. //用于判定是否是一个认证的用户在访问Portlet,如果是,则返回用户名,否则返回null
  3.  public abstract String getRemoteUser(); 
  4. //用处同上,不过它返回一个java.security.Principal对象
  5.  public abstract Principal getUserPrincipal(); 
  6. //判定某个认证的用户是否属于某个role,这个role配置在portlet.xml中
  7.  public abstract boolean isUserInRole(String paramString); 

 

-------

关于role的配置

首先在portlet.xml中的每一个<security-role-ref>中,给出<role-name> 和<role-link>对

  1. <security-role-ref> 
  2. <role-name>administrator</role-name> 
  3. <role-link>Administrator</role-link> 
  4. </security-role-ref> 

其中 <role-name>元素中的字符串会传递给isUserInRole()方法

然后<role-link>作为钩子(hook),必须关联到真实的Portal Server上的配置。

比如如果portlet应用部署在liferay上,那么在liferay配置文件liferay-portlet.xml中,就必须给出一个个的<role-mapper>,从而成功的将真实Portal环境中的角色填充进去

  1. <role-mapper> 
  2. <role-name>administrator</role-name> 
  3. <role-link>Administrator</role-link> 
  4. </role-mapper> 

最后在代码中,用isUserInRole来进行角色的定制

 

  1. if(request.isUserInRole("administrator")) { 
  2. //-- allow user to add book 
  3. else { 
  4. //-- throw security exception