Авторизация Spring Security на основе URL - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу реализовать авторизацию на основе URL в одном из моих проектов Spring mvc.В моем весеннем проекте MVC я использую конфигурацию Java. Я использовал этот сайт https://www.baeldung.com/role-and-privilege-for-spring-security-registration для реализации авторизации на основе ролей и привилегий.

Итак, я создал следующие таблицы для реализации.

Это пользовательская таблица.

enter image description here

Эта таблица ролей.

enter image description here

Это таблица соответствия между ролью и привилегией.

enter image description here

Это таблица привилегий.

enter image description here

Ниже приведен код со стороны контроллера.

@Controller
@RequestMapping(value={"/user"})
public class UserController {

    @ResponseBody
    @RequestMapping(value={"/userDashboard"},method = RequestMethod.GET)
    public String userDashboard(ModelMap model){
        return "UserDashboard";
    }

    @ResponseBody
    @RequestMapping(value={"/testUser"},method = RequestMethod.GET)
    public String testUser(ModelMap model){
        return "TestUser";
    }

}

Ниже приведен код для реализации UserDetailService.

@Service("authService")
@Transactional
public class AuthService implements UserDetailsService {

    @Autowired
    private UserDaoInterface userDaoInterface;

    private static final Logger log = Logger.getLogger(AuthService.class);

    @Override
    public UserDetails loadUserByUsername(String userName) {
        User user = null;
        try {
            user = userDaoInterface.getUserByUserName(userName);
        } catch (Exception e) {
            log.error("AuthService @loadUserByUsername --Exception while fetching user from username",e);
        }

        if(user == null) {
            throw new UsernameNotFoundException("Username not found");
        }

        UserDetails userDetails = new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(),!user.getIsDeleted(),true,true,true,getAuthorities(user.getRole()));

        log.info("UserService userDetails " + userDetails);

        return userDetails;
    }

    private Collection<? extends GrantedAuthority> getAuthorities(Role role) {  
        return getGrantedAuthorities(getPrivileges(role));
    }

    private List<String> getPrivileges(Role role) {
        List<String> privileges = new ArrayList<>();
        List<Privilege> collection = new ArrayList<>();
        collection.addAll(role.getPrivileges());
        for (Privilege item : collection) {
            privileges.add(item.getName());
        }
        return privileges;
    }

    private List<GrantedAuthority> getGrantedAuthorities(List<String> privileges) {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (String privilege : privileges) {
            authorities.add(new SimpleGrantedAuthority(privilege));
        }
        return authorities;
    }
}

Spring Security Configuration

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
@ComponentScan("com.project")
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService authService;

    @Autowired
    PersistentTokenRepository tokenRepository;

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(authService);
        auth.authenticationProvider(authenticationProvider());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(authService);
        authenticationProvider.setPasswordEncoder(passwordEncoder());
        return authenticationProvider;
    }

    @Bean
    public PersistentTokenBasedRememberMeServices getPersistentTokenBasedRememberMeServices() {
        return new PersistentTokenBasedRememberMeServices("remember-me", authService, tokenRepository);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests().anyRequest().authenticated()
         .and()
        .formLogin()
        .loginProcessingUrl("/login")
        .defaultSuccessUrl("/login")
        .and()
        .logout().logoutUrl("/logout")
        .logoutSuccessUrl("/")
        .and().csrf()
        .and().rememberMe().rememberMeParameter("remember-me").tokenRepository(tokenRepository).tokenValiditySeconds(86400);
    }
}

Когда я вошел в систему с учетными данными, которые хранятся в таблице пользователей, и попытался получить доступ к URL-адресу, например http://localhost:8080/RestProject/user/testUser, тогда пользователь авторизованчтобы получить доступ к этому URL, но согласно вышеописанной реализации пользователю не следует разрешать доступ к этому URL.Так я не могу понять, как здесь будет работать динамическое разрешение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...