Я работаю над проектом Spring mvc с использованием весенней безопасности, я новичок в весенней безопасности, и я хотел знать, как иметь двух типов пользователей в моем приложении, обычного пользователя и администратора, и показывать другую страницу индекса администратору и другой индексной странице с меньшими функциями для обычного пользователя, до сих пор у меня это:
Мой конфигурационный класс WebSecurityConfigurerAdapter
public class ConfigSecurity extends WebSecurityConfigurerAdapter {
private AutenticarProvider authen;
@Override
protected void configure( HttpSecurity http ) throws Exception
{
http
.authenticationProvider(authen)
.authorizeRequests()
.antMatchers("/resources/**").permitAll()
.antMatchers("/css/**").permitAll()
.antMatchers("/js/**").permitAll()
.antMatchers("/img/**").permitAll()
.antMatchers("/sound/**").permitAll()
.antMatchers("/fonts/**").permitAll()
.antMatchers("/ajax/**").permitAll()
.antMatchers("/php/**").permitAll()
.antMatchers("/xml/**").permitAll()
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") <-- i am not sure about this just guessing
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage")
.permitAll()
.and()
.logout()
.permitAll();
}
}
И мой класс, который реализует AuthenticationProvider:
@Component
public class AutenthenProvider implements AuthenticationProvider
{
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
User user = null;
Authentication auth = null;
String name = null;
String password = null;
try
{
name = authentication.getName();
password = authentication.getCredentials().toString();
if(name != null && !name.trim().equals("") && password != null && !password.trim().equals(""))
{
user = this.obtainUserFromDataBase(name);
if(user != null)
{
List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
auth = new UsernamePasswordAuthenticationToken(name, password);
}
else
{
throw new UsernameNotFoundException("the user dont exist");
}
}
else
{
throw new BadCredentialsException("invalid credentials");
}
}
catch (AuthenticationException e) {
throw e;
}
catch (Exception ex) {
throw new AuthenticationServiceException("", ex.getCause());
}
return auth;
}
и мой метод контроллера из моего класса контроллера
@RequestMapping(value = "/loginPage", method = RequestMethod.GET)
public String loginPage(Model model) {
logger.info("**Login PAGE!!**");
return "loginPage";
}
Я думаю о том, чтобы поместить эту строку .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
в моем методе configure, но я не уверен, как это работает, если я полагаю, что это означает что у меня будут повторяющиеся страницы, потому что в моем приложении есть страницы, которые могут быть просмотрены обоими пользователями, значит ли это, что я буду дублировать эти две страницы, но в разных папках?
Во-первых, правильный способ - использовать роли. В вас AuthenticationProvider
вы даете GrantedAuthority
ROLE_ADMIN
для пользователей-администраторов, слегка изменив его:
List<GrantedAuthority> grantedAuths = new ArrayList<GrantedAuthority>();
// only if user is recognized as admin
grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN")
auth = new UsernamePasswordAuthenticationToken(name, password);
Затем вы сможете использовать .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
чтобы ограничить доступ к /admin/**
пользователям admin, и вы можете добавить JSP страница
<sec:authorize access="hasRole('ROLE_ADMIN')">
This content will only be visible to users who have
the "ROLE_ADMIN" authority in their list of <tt>GrantedAuthority</tt>s.
</sec:authorize>
как предложено 909 Никлас
Во всяком случае, мне почти никогда не приходилось внедрять AuthenticationProvider
. Обычно я использую DaoAuthenticationProvider
и соответствующий UserDetailsService
(InMemoryUserDetailsManager
для тестов и JdbcUserDetailsManager
когда пользователи хранятся в настоящей базе данных).
Вы можете использовать теги, которые Spring встроил для этой цели на основе ролей, например, администратора или пользователя. Вы также можете определить пользовательские роли.
<sec:authorize access="hasRole('supervisor')">
This content will only be visible to users who have
the "supervisor" authority in their list of <tt>GrantedAuthority</tt>s.
</sec:authorize>
Возможно, вам также повезло с методом hasRole ([role]) для решения на основе кода или посмотрите на этот ответ. Как проверить "hasRole" в Java-коде с Spring Security?
hasRole([role])
(но я сам не пробовал)