【轉(zhuǎn)自】http://caterpillar.onlyfun.net/Gossip/JSPServlet/JSPServlet.htm
雖 是所謂的編程式安全,不過還是搭配之前所談及的宣告安全環(huán)境設(shè)定來達(dá)成,您可以從HttpServletRequest的 getUserPrincipal()來取得代表登入使用者的Principal,或是使用getRemoteUser()方法來取得登入的使用者名稱。
一個(gè)搭配Role設(shè)定的方法是isUserInRole(),若您的使用者已經(jīng)通過驗(yàn)證,可以藉由這個(gè)方法於程式中判定登入的使用者其Role為何,並進(jìn) 一步?jīng)Q定可使用的資源,像是可以決定使用者是否出現(xiàn)進(jìn)階使用者選單、試用帳號(hào)是否過期之類,這是單純對(duì)URL作防護(hù)的設(shè)定所無法達(dá)到的,例如:
...
if(request.isUserInRole("manager")) {
??? // 顯示管理者選單
}
else {
??? // 顯示一般使用者選單
}
...
若您事先無法決定Role名稱,則可以透過設(shè)置<security-role-ref>,將程式中的Role名稱,連結(jié)至 <security-role>的Role名稱,例如:
...
??? <servlet>
??????? <servlet-name>HelloServlet</servlet-name>
??????? <servlet-class>onlyfun.caterpillar.HelloServlet</servlet-class>
??????? <security-role-ref>
??????????? <role-name>manager</role-name>
??????????? <role-link>admin</role-link>
??????? </security-role-ref>
??? </servlet>
??? <servlet-mapping>
??????? <servlet-name>HelloServlet</servlet-name>
??????? <url-pattern>/HelloServlet</url-pattern>
??? </servlet-mapping>
?? <security-role>
??????? <role-name>admin</role-name>
??????? <role-name>normal</role-name>
??? </security-role>
...
如此一來,您的程式中的manager,實(shí)際上就會(huì)對(duì)應(yīng)至admin的Role名稱,如此,就不用擔(dān)心在程式中寫死Role名稱。
文章來源:
http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!789.entry