В Spring Security 3, как настроить мою аннотацию @ PreAuthorize?

В эти дни я сталкиваюсь с проблемой, я не могу понять это, поэтому, пожалуйста, помогите мне...

Моя сущность: Utilisateur это французское слово означает пользователь

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    public class Utilisateur implements Serializable 
    {
         private static final long serialVersionUID = 1L;
         @Id
         @GeneratedValue(strategy = GenerationType.IDENTITY)
         protected int id;
         protected String login;
         protected String password;
         protected String nom;
         protected String prenom;
         protected String email;
         protected String username;}

    @OneToOne(mappedBy="user", cascade={CascadeType.ALL})
    private Role role;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return login;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNom() {
        return nom;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }



    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

и Role юридическое лицо.

В моем веб-приложении есть контроллер, который показывает, например, информацию о студенте (Etudiant На французском)

@EJB(mappedName = "Etudiant.EtudiantFacade")
    EtudiantFacade etudiantF;

    // Affiche le detail d'un Etudiant  (show the infomations of the student)
    @RequestMapping(value = "/Etudiant/{idEtudiant}/info")
    public ModelAndView detail(@PathVariable String idEtudiant, Model m) {
        m.addAttribute("etudiant",
                etudiantF.trouver(Integer.parseInt(idEtudiant)));
        return new ModelAndView("EtudiantInformation", "null", null);
    }

Я реализовал свой собственный CustomUseDetailService используя объект Utilisateur непосредственно.

 @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {
        // TODO Auto-generated method stub
        System.out.println("!!!!!!!!!!!!!!!!!");
        System.out.println(username);

        boolean enabled = true;
        boolean accountNonExpired = true;
        boolean credentialsNonExpired = true;
        boolean accountNonLocked = true;

            Utilisateur etudiant = etudiantF.trouverParLogin(username);


            return new User(etudiant.getLogin(), etudiant.getPassword(), enabled,accountNonExpired,credentialsNonExpired,accountNonLocked,getAuthorities(etudiant.getRole().getRole()));

    }

и мой security.xml ниже:

<http auto-config="true" use-expressions="true">
        <intercept-url pattern="/app/Login" access="permitAll"/>
        <intercept-url pattern="/app/*" access="hasAnyRole('ROLE_ADMIN','ROLE_USER')"/>
        <form-login login-page="/app/Login" 
            authentication-success-handler-ref="authenticationSuccessHandler"/> 
        <logout logout-url="/app/Logout" logout-success-url="/"/>
    </http>

    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="customUserDetailsService"/>
    </authentication-manager>

Последний мой вопрос: для студента, его идентификатор 1, его имя пользователя stu1, для управления этим студентом с идентификатором 1 может получить доступ только к его собственной странице информации /ProjetName/Student/{studentId}/Infoкак мне написать код с @PreAuthorizeЯ вижу документ по форме весной, есть пример вроде @PreAuthorize(#contract.name = principal.username)потому что в основном есть атрибут username, но здесь мне нужен Id, я использую @RequestMapping(value = "/Etudiant/{idEtudiant}/info") соответствовать студенту, а не имени пользователя. Так как я могу решить это? Большое спасибо... Я не могу найти учебник.

1 ответ

Решение

Вы можете предоставить свою собственную реализацию для класса User (просто расширьте org.springframework.security.core.userdetails.User). Добавьте поле идентификатора к нему. Затем установите соответствующее значение в методе loadUserByUsername:

@Override
public UserDetails loadUserByUsername(String username)
    ...
    return new CustomUser(etudiant.getId(), etudiant.getLogin(), etudiant.getPassword(), enabled,accountNonExpired,credentialsNonExpired,accountNonLocked,getAuthorities(etudiant.getRole().getRole()));

}

Тогда вы сможете использовать его:

@PreAuthorize(#contract.name = principal.id)
Другие вопросы по тегам