2016-12-06 2 views
-1

J'essaie d'utiliser preAuthorize pour protéger l'URL. Seules les personnes inscrites au cours peuvent accéder au cours. Voici mon code:@PreAuthorize ne fonctionne pas sur le contrôleur en utilisant

Controller:

@Controller 
@RequestMapping(value = "/course/{courseId}") 
@PreAuthorize("@userService.isCurrentUserinCourse(authentication, courseId)") 
public class SyllabusController { 
    @RequestMapping(value = { "/syllabus" }, method = RequestMethod.GET) 
    public ModelAndView syllabusPage(@PathVariable("courseId") int courseId) { 
    ...} 

UserServiceImpl:

@Service("userService") 
public class UserServiceImpl implements UserService { 
    @Autowired 
    private UserDAO userDAO; 
    @Override 
    public boolean isUserinCourse(int userId, int courseId) { 
     return userDAO.isUserinCourse(userId, courseId); 
    } 

    @Override 
    public boolean isCurrentUserinCourse(Authentication authentication, int courseId) { 
    if (!(authentication instanceof AnonymousAuthenticationToken)) { 
      return isUserinCourse(((UserModel) authentication.getPrincipal()).getId(), courseId); 
    } 
    return false; 
} 

printemps-security.xml:

<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.0.xsd 
http://www.springframework.org/schema/security 
http://www.springframework.org/schema/security/spring-security-3.2.xsd"> 
<global-method-security pre-post-annotations="enabled" /> 
<!-- enable use-expressions --> 
<http auto-config="true" use-expressions="true"> 

et nous je vais à/cours/{id }/syllabus sans connexion, il montre la page où il ne devrait pas. Et le débogage ne va pas dans la méthode isCurrentUserinCourse (Authentication authentication, int courseId) dans UserServiceImpl. où

+1

Re lire le manuel: http://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html#el-pre-post-annotations (pas t la version actuelle mais elle s'applique toujours) –

+1

voir aussi http://stackoverflow.com/questions/32156407/preauthorize-is-not-working-what-peut-les-problems?rq=1 –

Répondre

0
@PreAuthorize("@userService.isCurrentUserinCourse(authentication, courseId)") 

Vous pouvez obtenir l'authentification en suivant la méthode statique

SecurityContextHolder.getContext().getAuthentication() 

et courseId vous devez changer #coureseId, et vous devez déplacer ce à la méthode, pas de classe, de sorte que vous pouvez changer pour

@PreAuthorize("@userService.isCurrentUserinCourse(#courseId)") 
    @RequestMapping(value = { "/syllabus" }, method = RequestMethod.GET) 
    public ModelAndView syllabusPage(@PathVariable("courseId") int courseId) { 
    ...}