В 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)