@Exiger une autorisation préalable ne fonctionne pas avec la méthode des règles de sécurité et les paramètres de la méthode
Je suis l'ajout de Printemps de Sécurité à un projet pour le Printemps.
L'architecture du système est le REPOS et l'utilisateur peut avoir accès à différentes ressources.
Je voudrais donner accès à des renseignements personnels pour les administrateurs et les utilisateurs qui sont les propriétaires de cette information.
J'ai commencé simple: le filtrage de profil utilisateur comme ceci:
Dans mon de la couche de service j'ai voulu utiliser la méthode des annotations et comprennent des paramètres de la méthode..
@PreAuthorize("hasRole('ROLE_ADMIN') or principal.userId == #id")
public Usuario getUser(int id) throws DAOException {
...
}
Mais ce n'est pas de travail du tout. Tout utilisateur peut voir tous les profils (les admins et tous les utilisateurs) lorsque cette URL est demandée (Web de la couche de):
@RequestMapping(value="/user/{uid}", method=RequestMethod.GET)
public ModelAndView getUser(@PathVariable int uid) throws DAOException {
userDAO = new UsuarioJPADAO();
userService.setUsuarioDAO(userDAO);
return new ModelAndView("user", "user", userService.getUser(uid));
}
Voici mon security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<!-- Security Annotations -->
<global-method-security
pre-post-annotations="enabled"/>
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/css/**" access="permitAll" />
<intercept-url pattern="/images/**" access="permitAll" />
<intercept-url pattern="/js/**" access="permitAll" />
<intercept-url pattern="/favicon.ico" access="permitAll" />
<intercept-url pattern="/login" access="permitAll" />
<intercept-url pattern="/users" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/users/page/*" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/customers" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/employees" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/search/*" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/*" access="hasAnyRole('ROLE_ADMIN, ROLE_EMPLOYEE, ROLE_PARTNER, ROLE_USER')" />
<intercept-url pattern="/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<intercept-url pattern="/*/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<intercept-url pattern="/*/*/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<intercept-url pattern="/*/*/*/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<intercept-url pattern="/*/*/*/*/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<intercept-url pattern="/*/*/*/*/*/*/*" access="hasAnyRole('ROLE_USER, ROLE_ADMIN')" />
<form-login login-page="/login" login-processing-url="/doLogin"
authentication-failure-url="/login?error"
username-parameter="username" password-parameter="password"
default-target-url="/default" />
<logout invalidate-session="true" logout-success-url="/login?logout" logout-url="/logout"/>
</http>
<authentication-manager>
<authentication-provider user-service-ref="UsuarioService">
</authentication-provider>
</authentication-manager>
J'ai vérifié Printemps de Sécurité 3.1 livre et apparemment, ma configuration est comme le livre suggère. J'ai lu d'autres de Débordement de Pile postes (ici et ici) mais j'ai pas eu de chance.
Mise À Jour: Ajouté application-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<context:annotation-config />
<context:component-scan base-package="com.pe.fs" />
<mvc:annotation-driven />
<mvc:resources mapping="/**" location="/" />
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
<!-- DataSource -->
<bean id="jpaDataSource" class="oracle.jdbc.pool.OracleDataSource"
destroy-method="close"
p:driverType="oracle.jdbc.OracleDriver"
p:user="**********"
p:password="**********"
p:uRL="jdbc:oracle:thin:@localhost:1521:XE"
/>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"></property>
<property name="persistenceUnitName" value="freesunPU" />
<property name="dataSource" ref="jpaDataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
<property name="showSql" value="false" />
</bean>
</property>
<property name="loadTimeWeaver">
<bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<tx:annotation-driven mode="aspectj"/>
<context:load-time-weaver aspectj-weaving="autodetect" />
Mise à jour: j'ai ajouté spring-security-aspects
de POM et aucun changement. D'autres modifications proposées dans les réponses ont été testées, mais les annotations telles @PreAuthorize
ne fonctionnent toujours pas. L'aiic-ce un problème entre les contextes? Peut être l'utilisation d'aspectJ la raison?
Ce que je fais mal?
Usuario getUser(int id)
méthode est définie dans l'interface? Par défaut, ce type d'annotations peut ne pas fonctionner (JDK proxieas sont utilisés pour ajouter des contrôles d'autorisation lors de l'exécution et de cibler uniquement les méthodes d'interface)Pas de. Mon UsuarioService implémente UserDetailsService. Je travaille aussi avec mon propre UsuarioDetails classe qui étend la classe de mon domaine Usuario et met en œuvre UserDetails
wft homme? 🙂 <intercepter-modèle d'url="/*/*/*/*/*" accès="hasAnyRole('ROLE_USER, ROLE_ADMIN')" /> modifier ""/*/*/*/*/*"" "/**"
Je n'ai pas de maintenir cette application plus mais merci pour les conseils!!!
OriginalL'auteur Spacemonkey | 2013-03-12
Vous devez vous connecter pour publier un commentaire.
J'ai enfin trouvé la solution.
En j'ai DONC trouvé des utile réponses. Voir ici et ici.
J'ai déménagé
global-method-security
àapplication-context.xml
qui est le cadre de mes services.Où
mode="aspectj"
comme Javadoc dit:Bien sûr, j'ai ajouté à la POM
spring-security-aspects
:Cher @MaksymDemidas, je vous remercie pour votre aide.
déplacer mondial de la méthode de sécurité a résolu mon problème. docs.printemps.io/printemps-sécurité/site/faq/...
OriginalL'auteur Spacemonkey
Ajouter une nouvelle interface:
Mettre en œuvre dans votre service à l'usager et essayez à nouveau. Le printemps sera en mesure d'ajouter demandé l'autorisation vérifie à l'aide du JDK procurations.
Comme autre option, vous pouvez configurer Printemps à l'utiliser un peu plus de poids lourd bibliothèques comme Javassist ou même AspectJ.Dans ce cas, l'interface sera pas nécessaire.
MODIFIER. Assurez-vous que
global-method-security
est déclaré dans le même ressort d'un contexte avec le service à l'usager bean.Oui, les annotations sont normalement appliqué sur côté de mise en œuvre
S'il vous plaît montrer votre source xml. Vous pouvez avoir deux printemps contextes (pour les haricots et les pour Spring MVC). Êtes-vous sûr que votre mondiale-méthode-de la sécurité elemnt est définie dans le même contexte avec l'utilisateur de votre service?
J'ai ajouté printemps xml. Le fait est que je ne suis pas déclarer les haricots ici. Il est vrai que j'ai un autre contexte: Spring MVC. Et mondial de la méthode-la sécurité est déclarée, il. Je devrais peut-être déplacer le mondial de l'annotation de printemps xml.
Vous pouvez le déclarer dans les deux contextes pour être sûr que vos annotations marche partout
OriginalL'auteur Maksym Demidas
La voie alternative est d'ajouter le code suivant dans votre security.xml
Il veillera à ce que seul l'administrateur peut accéder aux ressources de départ avec motif /utilisateur/.
OriginalL'auteur Arjun Thakur