Как показать другую страницу для типа пользователя в весенней безопасности

1

Я работаю над проектом 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, но я не уверен, как это работает, если я полагаю, что это означает что у меня будут повторяющиеся страницы, потому что в моем приложении есть страницы, которые могут быть просмотрены обоими пользователями, значит ли это, что я буду дублировать эти две страницы, но в разных папках?

Теги:
spring-security
spring
spring-mvc
login

2 ответа

0

Во-первых, правильный способ - использовать роли. В вас 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 когда пользователи хранятся в настоящей базе данных).

0

Вы можете использовать теги, которые 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?

  • 1
    у меня есть конфигурация на основе кода, и все учебники, которые я нашел, предназначены для конфигурации с XML.
  • 0
    Я думаю, что вы можете использовать метод hasRole([role]) (но я сам не пробовал)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню