Comment définir le rôle de l'utilisateur dans le Printemps de Sécurité 3?
Je suis en train de travailler sur JAVA EE technologie pour en savoir plus JSF-Spring-Hibernate vs...
Je suis en train de faire une application web avec diffirent rôles d'utilisateur. Maintenant, je n'ai qu'un utilisateur rôle ROLE_USER. Je ne pouvais pas changer ce rôle. J'ai essayé de debug mod pour comprendre comment nous définir ce rôle, mais je ne pouvais pas comprendre d'où cela se passe.
Donc, mon principal problème est que je ne peut pas créer un autre RÔLE dans mon application. Si je n'utilise pas <secured attributes="ROLE_USER" />
dans mon flow (je suis à l'aide de spring web flow) tout le monde peut rejoindre cette page. Si je ne fais que ROLE_USER. Mais je veux créer un nouveau rôle nommé ROLE_ADMIN et ne laisse ROLE_ADMIN pour atteindre cette page.
NOTE: je n'ai pas d'ajouter tous les fichiers, ici, la cause est parlé à moi, que seuls les compléter avec d'autres classes et les fichiers. Si vous avez besoin de plus d'informations s'il vous plaît laissez-moi savoir.
C'est le tutoriel soruce code que je suis.
https://code.google.com/p/jee-tutorial-youtube/source/browse/
security-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<security:http auto-config="true">
<security:form-login login-page="/app/main"
default-target-url="/app/account" />
<security:logout logout-url="/app/logout"
logout-success-url="/app/main" />
</security:http>
<security:authentication-manager>
<security:authentication-provider
user-service-ref="userServiceImp">
<security:password-encoder hash="md5" />
</security:authentication-provider>
</security:authentication-manager>
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userServiceImp" />
<property name="hideUserNotFoundExceptions" value="false" />
</bean>
<bean id="authenticationManager"
class="org.springframework.security.authentication.ProviderManager">
<constructor-arg>
<ref bean="daoAuthenticationProvider" />
</constructor-arg>
</bean>
C'est mon UserAuthenticationProviderServiceimp classe où je authenticatethe l'utilisateur.
public boolean processUserAuthentication(Users user) {
try {
Authentication request = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword());
Authentication result = authenticationManager.authenticate(request);
SecurityContextHolder.getContext().setAuthentication(result);
return true;
} catch(AuthenticationException e) {
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "Sorry!"));
return false;
}
}
Et je me figure que cette fonction, im ma classe de Service, est appelé en processUserAuthentication.Alors j'ai pensé que c'est la fonction, où les Rôles sont programmés.
public UserDetails loadUserByUsername(String userName)
throws UsernameNotFoundException {
Users user = userDao.loadUserByUserName(userName);
if (user == null) {
throw new UsernameNotFoundException(String.format(
getMessageBundle().getString("badCredentials"), userName));
}
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("USER_ROLE"));
User userDetails = new User(user.getUserName(), user.getPassword(),
authorities);
return userDetails;
}
Mise à jour:
Dans mon projet, je dois utiliser cette syntaxe pour créer des rôles: ROLE_X où x est une chaîne. Exemple, on peut en avoir ROLE_MYNAME mais nous ne pouvons pas avoir fait saillie MYNAME ou MYNAME_ROLE comme rôle. Il a commencer avec ROLE_. Je suis encore à essayer de trouver ce couses ce problème. Je mettrai à jour Si j'ai trouvé la réponse.
EDIT:
Il y a une explication détaillée pourquoi on doit utiliser ROLE_ dans cette page;
http://bluefoot.info/howtos/spring-security-adding-a-custom-role-prefix/
OriginalL'auteur endertunc | 2014-07-23
Vous devez vous connecter pour publier un commentaire.
Maintenant USER_ROLE est codé en dur dans votre application. Idéalement Utilisateur de mappage de Rôle viendrait de la part des Autorités de la table dans la base de données. Cette cartographie info peuvent ensuite être récupérées à l'aide d'une base de données de la requête et ajouter ensuite les autorités de la collection.
Printemps de Sécurité DB schéma
authorities.add(new SimpleGrantedAuthority("USER_ROLE"));
Je pense que c'est la ligne que nous avons mis de l'utilisateur autorités coder en dur, non? Donc, Si j'écrisauthorities.add(new SimpleGrantedAuthority("ROLE_X"));
puis changer la garantie de l'étiquette comme<secured attributes="ROLE_X" />
je devrait fonctionner, non? Mais Il n'a tout simplement pas. J'ai lu quelques artical sur l'obtention des rôles de base de données, mais firstlty je veux être sûr que c'est un travail ou pas. S'il vous plaît laissez-moi savoir Si j'ai mal compris.Tout ce que tu viens de poster doit travailler, dur de codage de l'autorité de ROLE_ADMIN. Pouvez-vous activer le débogage pour org.springframework.de sécurité et de vérifier ce que les journaux disent que pour l'url que vous tentez d'accéder.
- Je ajouter de log4j.de la catégorie.org.springframework.sécurité=DEBUG de mon fichier log4j puis j'ai eu ce journal.(pastebin.com/e5HX7T4Y), j'ai copié à partir de la console mais il me montre une partie. Et stackoverflow ne me laisse pas mettre ici, donc j'ai collé à pastebin. Où je peux atteindre le fichier journal complet.C'est mon fichier log4j: pastebin.com/x8W2ye45
Êtes-vous à l'aide de l'id utilisateur wer? À partir des journaux, il ressemble à l'utilisateur d'obtenir le rôle - TEST_ROLE. SecurityContext stockées à HttpSession: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@9e7d34a3: Directeur: org.springframework.security.core.userdetails.User@1cb64: nom d'utilisateur: wer; Mot de passe: [PROTÉGÉS]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Accordé Autorités: TEST_ROLE; les informations d'Identification: [PROTÉGÉS]; Authentifié: true; Détails: null; Accordé Autorités: TEST_ROLE'
Je ne pouvais pas comprendre ce que tu veux dire en disant userid wer? Mais, j'ai trouvé le problème. Nous avons besoin d'utiliser cette syntaxe pour être en mesure de créer des rôles. La syntaxe est ROLE_X où X est une chaîne. J'ai écrit ça, mais je l'ai fait de mal (pauvre de moi, désolé). Nous pouvons avoir ROLE_TEST mais nous ne pouvons pas utiliser TEST_ROLE ou TEST de rôle. Je ne sais pas pourquoi nous devons utiliser ROLE_ mais il fonctionne de cette façon. Ma recherche est toujours en cours d'trouvé la vraie raison de cela 😉
OriginalL'auteur gad