programmera.net -> ejb -> normal för utskrift | info@programmera.net |
Säkerhet
1. Säkerhet 2. Sätt rättighet per metod: Kodexempel 3. Run-as: Kodexempel 4. Utnyttja isCallerInRole(): Kodexempel 5. Idéer bakom säkerhetsarkitekturen 6. Vem har ansvar för vad? |
1. Säkerhet
I EJB 2.0 finns en specifikation för hur säkerhet kan hanteras. Vi börjar med att titta på hur ett anrop till en böna ser ut:
När ett anrop till en böna anländer till steg 3 (behållaren) så validerar behållaren användaren för den aktuella metoden. Vad är det som sker då behållaren ska avgöra om just denna användare har rätt att anropa denna metod hos bönan? Jo:
2. Sätt rättighet per metod: Kodexempel
Nedan visas ett exempel på hur du kan koppla olika metoder till rollen "salesman":
Lägg märke till:
<assembly-descriptor>
<security-role>
<description>
Represents anybody who has the authority
to perform a trade.
</description>
<role-name>salesman</role-name>
</security-role>
<method-permission>
<role-name>salesman</role-name>
<method>
<ejb-name>BookingBean</ejb-name>
<method-name>*</method-name>
</method>
<method>
<ejb-name>InvoiceBean</ejb-name>
<method-name>cancelInvoice</method-name>
</method>
</method-permission>
<method-permission>
<unchecked/>
<method>
<ejb-name>ViewProductBean</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
</assembly-descriptor>
3. Run-as: Kodexempel
Ibland sker anrop mellan bönor. Tänka att en böna (böna1) anropar en annan böna (böna2). I normala fall kommer böna2 att göra validering av samma användare som blev validerad i böna1. För att ändra detta, så att alla anrop som sker från böna1 antar en viss roll kan man använda "run-as". Se exempel nedan:
Nu kommer alla anrop från "BookingBean" till andra bönor göras med rollen "admin". Figuren nedan illustrerar då "BookingBean" gör ett anrop till "ProductBean":
<enterprise-beans>
...
<session>
<ejb-name>BookingBean</ejb-name>
...
<security-identity>
<run-as>
<role-name>admin</role-name>
</run-as>
</security-identity>
</session>
</enterprise-beans>
4. Utnyttja isCallerInRole(): Kodexempel
Programmeraren har möjlighet att kontrollera huruvida en användare innehar en viss roll. Detta kan behövs i vissa situationer då kontroll på metodnivå inte ger tillräcklig flexibilitet. Nedan ges ett exempel:
För att detta ska fungera krävs att rollen "customer" finns definierad i en tagg som kallas för "security-role-ref", se exemplet nedan:
...
if(isCallerInRole("customer") && bid.getMoney() < 1000 ){
// Caller is a Customer and has a low bid,
// therefore he is not allowed to see other bids
throw new BookingException("Caller is not valid");
}else{
// Go on..
}
...
Se förklaring nedan:
<enterprise-beans>
...
<session>
<ejb-name>BookingBean</ejb-name>
...
<security-role-ref>
<role-name>customer</role-name>
<role-link>customer</role-link>
</security-role-ref>
</session>
</enterprise-beans>
5. Idéer bakom säkerhetsarkitekturen
Vilkar idéer har drivit fram den gällande säkerhetsarkitekturen:
6. Vem har ansvar för vad?
Denna bild beskriver vem som har ansvar för vad: