雖 是所謂的編程式安全,不過還是搭配之前所談及的宣告安全環境設定來達成,您可以從EJBContextt的 getCallerPrincipal()來取得代表登入使用者的Principal,使用Principal的getName()方法來取得登入的使用 者名稱。
EJBContext一個搭配Role設定的方法是isCallerInRole(),若您的使用者已經通過驗證,可以藉由這個方法於程式中判定登入的使 用者其Role為何,並進 一步決定可使用的資源,例如:
...
if(context.isCallerInRole("manager")) {
// 呼叫管理者方法
}
else {
// 其它...
}
...
if(context.isCallerInRole("manager")) {
// 呼叫管理者方法
}
else {
// 其它...
}
...
若您事先無法決定Role名稱,則可以透過設置部署描述檔的<security-role-ref>,將程式中的Role名 稱,連結至實際部署時決定的Role名稱,例如在ejb-jar.xml中:
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<local>onlyfun.caterpillar.HelloBean</local>
<ejb-class>onlyfun.caterpillar.HelloBeanImpl</ejb-class>
<session-type>Stateless</session-type>
<security-role-ref>
<role-name>manager</role-name>
<role-link>admin</role-link>
</security-role-ref>
</session>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>admin</role-name>
</security-role>
...
<method-permission>
<role-name>admin</role-name>
<method>
<ejb-name>HelloBean</ejb-name>
<method-name>doSecurity</method-name>
</method>
</method-permission>
....
</assembly-descriptor>
</ejb-jar>
<enterprise-beans>
<session>
<ejb-name>HelloBean</ejb-name>
<local>onlyfun.caterpillar.HelloBean</local>
<ejb-class>onlyfun.caterpillar.HelloBeanImpl</ejb-class>
<session-type>Stateless</session-type>
<security-role-ref>
<role-name>manager</role-name>
<role-link>admin</role-link>
</security-role-ref>
</session>
</enterprise-beans>
<assembly-descriptor>
<security-role>
<role-name>admin</role-name>
</security-role>
...
<method-permission>
<role-name>admin</role-name>
<method>
<ejb-name>HelloBean</ejb-name>
<method-name>doSecurity</method-name>
</method>
</method-permission>
....
</assembly-descriptor>
</ejb-jar>
如此一來,您的程式中的manager,實際上就會對應至admin的Role名稱,如此,就不用擔心在程式中寫死Role名稱。