Я хочу реализовать авторизацию на основе URL в одном из моих проектов Spring mvc.В моем весеннем проекте MVC я использую конфигурацию Java. Я использовал этот сайт https://www.baeldung.com/role-and-privilege-for-spring-security-registration для реализации авторизации на основе ролей и привилегий.
Итак, я создал следующие таблицы для реализации.
Это пользовательская таблица.
Эта таблица ролей.
Это таблица соответствия между ролью и привилегией.
Это таблица привилегий.
Ниже приведен код со стороны контроллера.
@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.Так я не могу понять, как здесь будет работать динамическое разрешение?