編程式安全


雖 是所謂的編程式安全,不過還是搭配之前所談及的宣告安全環境設定來達成,您可以從EJBContextt的 getCallerPrincipal()來取得代表登入使用者的Principal,使用Principal的getName()方法來取得登入的使用 者名稱。

EJBContext一個搭配Role設定的方法是isCallerInRole(),若您的使用者已經通過驗證,可以藉由這個方法於程式中判定登入的使 用者其Role為何,並進 一步決定可使用的資源,例如:
...
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>

如此一來,您的程式中的manager,實際上就會對應至admin的Role名稱,如此,就不用擔心在程式中寫死Role名稱。