Odpoviem si sám, aspoň do archívu konferencie:

1. Vytvorím si vlastnú implementáciu AuthenticationProvider kde implementujem metódu authenticate().
public class MyAuthenticationProvider implements AuthenticationProvider
{
    /** */
    public Authentication authenticate(Authentication authentication) throws AuthenticationException
    {
        ...Doplniť autentifikáciu pomocou mojej service...
        authentication.setAuthenticated(true);
        return authentication;
    }

    /** */
    public boolean supports(Class authentication) {
        return (MyAuthenticationToken.class.isAssignableFrom(authentication));
    }
}

2. Vytvorím si vlastnú implementáciu AbstractAuthenticationToken kde prepíšem metódu getAuthorities() - keďže default sa vždy vytvorí RoleVoter, ten práve pracuje s rolami z tejto metódy.
public class MyAuthenticationToken extends AbstractAuthenticationToken
{
    @Override
    public GrantedAuthority[] getAuthorities()
    {
       ... Zistiť si role pomocou mojej service ako String[]...
       ... vrátiť role obalené do
GrantedAuthority[]...
    }
}

3. Do applicationContext-security.xml nastavím môjho provider-a:
    <bean id="myAuthenticationProvider" class="sk.nieco.MyAuthenticationProvider">
        <security:custom-authentication-provider />
    </bean>

4. Do aplikácie sa prihlásim kódom:
       ...
        Authentication authentication = new MyAuthenticationToken(name, password, mac);
        SecurityContextHolder.getContext().setAuthentication(authentication);
       ...

5. Ak sa použije tag <security:remember-me />, treba nadefinovať nejakú UserDetailsService.


Aké jednoduché :-)

Rastislav "Bedo" Siekel


Ing. Rastislav Siekel
Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia
E-mail : <[email protected]>
Tel : 041/562 54 91
Fax : 041/562 54 97
Mobil : 0905 34 00 20


Rastislav Siekel wrote:
Ahojte,

začínam so Spring security a neviem sa akosi vymotať z tých AuthenticationProvider-ov a AccessDecisionVoter-ov.

Mám aplikáciu, ktorá si autentifikáciu a autorizáciu rieši vlastnými prostriedkami. Pre autentifikáciu - login(String name, String password, String mac). Pre autorizáciu tam je metóda, ktorá mi vráti, či prihlásený užívateľ je v niektorej z rolí - konkrétne isUserInRole(String user, String[] roles).

Pri prechode na Spring security predpokladám, že urobím implementáciu AuthenticationProvider-a, kde si budem interne volať tieto metódy, ale tam sa interne používa interface Authentication, ktorý má mnoho implementácii xxxToken a ešte sa v konfigurácii používa interface AccessDecisionVoter, ktorý má tiež kopec implementácii xxxVoter priamo v Spring security.

Neviete ma niekto nakopnúť čím začať, prípadne aspoň linku na nejaký príklad, pretože príklady priamo pri Spring security sú len 2 a žiadny z nich nepoužíva tento prístup. Ani priateľ Google neponúka žiadny príklad na vlastnú implementáciu :-(.

Dík,
Rastislav "Bedo" Siekel.

Odpovedet emailem