2015-05-18 4 views
1

Я настроил весеннюю безопасность в своем приложении, аутентификация работает хорошо, но авторизация не работает, значит, @secured() аннотация не работает. Я получаю сообщение об ошибке при доступе к URL-адресу «Была непредвиденная ошибка (type=Forbidden, status=403). Доступ запрещен ".Весенние роли безопасности не работают

Моя весна конфигурации является

@Autowired 
    private MongoDBAuthenticationProvider authenticationProvider; 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     web.ignoring().antMatchers("/js/**", "/css/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http.formLogin().defaultSuccessUrl("/resource") 
       .and().logout().and().authorizeRequests() 
       .antMatchers("/logout").permitAll() 
       .antMatchers("/admin/**").hasRole("ADMIN") 
       .anyRequest() 
       .authenticated() 
       .and().csrf().disable(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(authenticationProvider); 
    } 

Мой контроллер

@RestController 
@RequestMapping("/user") 
public class UserController { 

    @Autowired 
    UserService userService; 

    @Secured(value={"ROLE_ADMIN"}) 
    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public void getUser() { 
     System.out.println("working"); 
    } 
} 

пользователь База данных

{ "_id" : ObjectId("555982a5360403572551660c"), "username" : "user", "password" : "pass", "role" : "ADMIN" } 

Мой провайдер MongoDB Auth

@Service 
public class MongoDBAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{ 


    @Autowired 
    MongoUserDetailsService mongoUserDetailsService; 

    @Autowired MongoTemplate mongoTemplate; 

    @Override 
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 

    } 

    @Override 
    protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) throws AuthenticationException { 

     UserDetails loadedUser; 

     try { 
      loadedUser = mongoUserDetailsService.loadUserByUsername(username); 
     } catch (Exception repositoryProblem) { 
      throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem); 
     } 

     if (loadedUser == null) { 
      throw new InternalAuthenticationServiceException(
        "UserDetailsService returned null, which is an interface contract violation"); 
     } 
     return loadedUser; 
    } 
} 

пользователя домена

public class User { 

    @Id 
    private String id; 
    @NotNull 
    private String name; 
    private int age; 
    private String username; 
    private String password; 
    private String role; 




    public User() { 
     super();   
    } 



    public User(String name,String username, 
      String password, String role) { 
     super(); 
     this.name = name; 
     this.username = username; 
     this.password = password; 
     this.role = role; 
    } 



    public String getId() { 
     return id; 
    } 



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



    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 


    public void setAge(int age) { 
     this.age = age; 
    } 


    public String getUsername() { 
     return username; 
    } 


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


    public String getPassword() { 
     return password; 
    } 


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



    public String getRole() { 
     return role; 
    } 



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

} 
+1

У вас есть роль ** ADMIN ** нет * * ROLE_ADMIN **. Либо исправьте выражение '@ Secured', либо измените пользователя в базе данных. Также префиксы 'hasRole' с' ROLE_'. –

+0

Вы имеете в виду, что мне нужно написать @Secured (value = {"ADMIN"})? –

+0

, пожалуйста, отправьте полную трассировку стека –

ответ

0

Добавить фасоль в Spring Security Config File

@Bean 
    public RoleVoter roleVoter() { 
     RoleVoter roleVoter = new RoleVoter(); 
     roleVoter.setRolePrefix(""); 
     return roleVoter; 
    } 

И пишет обеспеченное аннотацию, как этот

 @Secured(value={"ADMIN"}) 
+0

Я добавил этот файл в файл конфигурации spring, как roleVoter.setRolePrefix ("ROLE_"); , но он не работает –

+0

По префиксу Deafault есть «ROLE_» Поэтому вам нужно изменить либо в базе данных, либо установить префикс на «» – mirmdasif

+0

Эй, я думаю, что я что-то делаю неправильно, не могли бы вы рассказать мне, как это сделать с полным описанием? –

Смежные вопросы