不知道如何在spring boot security中配置访问权限

时间:2017-01-13 16:06:44

标签: java spring-boot spring-security

编辑5

愚蠢的我,ADMIN无法识别&因为我写了authorityByUsernameQuery查询错误:所以如果你有同样的问题,请检查出来。 现在配置工作:例如这里的代码

    protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/admin", "/admin/user").access("hasRole('ADMIN')") /**only ADMIN can see those pages**/
    .antMatchers("/page*").access("hasRole('USER')") /**only the users can see all the pages that start with 'page'**/
    .anyRequest().permitAll() /**all the other pages can seen by anyone**/
    .and()
    .formLogin()
    .loginPage("/login")
    .permitAll()
    .and()
    .exceptionHandling().accessDeniedPage("/403")
    .and()
    .logout().logoutSuccessUrl("/login?logout")
    .and()
    .csrf();
}

编辑4

如果我写了

${pageContext.request.isUserInRole('ADMIN')}

${pageContext.request.isUserInRole('USER')}

在我的jsp中,它会显示" false",因此它无法识别角色。但为什么呢?

编辑3

好的,现在我遇到了一个新问题(加上前一个问题):如何允许每个人访问某些页面?否则没有用户可以订阅。

编辑2

我按照dur的建议再次编辑了代码:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .antMatchers("/admin", "/admin/users").access("hasRole('ADMIN')") 
    .anyRequest().authenticated()
    .and()
    .formLogin()
    .loginPage("/login")
    .permitAll()
    .and()
    .exceptionHandling().accessDeniedPage("/403")
    .and()
    .logout().logoutSuccessUrl("/login?logout")
    .and()
    .csrf();
}

但它仍无法正常工作(管理员无法识别且无法访问其网页)。所以,我不认为它只是RULE_ADMIN的问题。

在我的数据库(postgres)中,我创建了这样的表:

CREATE TABLE public.utenti
(
  username character varying(45) NOT NULL,
  password character varying(45) NOT NULL,
  abilitazione boolean NOT NULL DEFAULT true,
  email character varying(45) NOT NULL,
  CONSTRAINT username PRIMARY KEY (username)
)

CREATE TABLE public.ruoli_utente
(
  user_role_id integer NOT NULL DEFAULT nextval('ruoli_utente_user_role_id_seq'::regclass),
  username character varying(45) NOT NULL,
  ruolo character varying(45) NOT NULL,
  CONSTRAINT user_role_pk PRIMARY KEY (user_role_id),
  CONSTRAINT username_fk FOREIGN KEY (username)
      REFERENCES public.utenti (username) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

authorityByUsernameQuery方法可能无法识别角色列,因为它的调用方式不同?如果是这样,为什么usersByUsernameQuery会识别启用的用户,因为我打电话给专栏' abilitazione'而不是启用'?

修改

也许我开始理解,我已经改变了我的方法:

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

    http
        .authorizeRequests()
            .antMatchers("/hello").access("hasRole('ROLE_ADMIN')")      
            .anyRequest().permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutSuccessUrl("/login?logout")  
            .and()
        .exceptionHandling()
            .accessDeniedPage("/403")
            .and()
        .csrf();
}

但它无法识别管理员用户。

我跟随this guide在Spring Boot Web应用程序中添加安全性。 我的安全类内部的configure方法存在问题,而且我很难理解如何解决在线搜索问题。

我想要做的是,如果用户经过身份验证,则允许在所有页面上进行访问,除了管理页面。

这就是我写的:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')");  
    http
        .authorizeRequests()
            .anyRequest().authenticated();
    http
        .formLogin()
            .loginPage("/login")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutSuccessUrl("/login?logout") 
            .and()
        .exceptionHandling()
            .accessDeniedPage("/403")
            .and()
        .csrf();
}

但是它不起作用,我无法理解为什么/我该怎么做,我也不能在网上找到解决方案(或者它没有工作/我没有&# 39;理解它。)

1 个答案:

答案 0 :(得分:0)

我愿意:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
    .antMatcher("/**").access("hasRole('ROLE_USER')")
    .antMatchers("/adminPage").access("hasRole('ROLE_ADMIN')")
    ...;
}

然后以某种方式编写自己的AutenticationManager: Custom Authentication Manager with Spring Security and Java Configuration

并创建您自己的对象extends org.springframework.security.core.userdetails.User与appropritate username, password, new ArrayList<GrantedAuthority>{{ add(new SimpleGrantedAuthority("ROLE_USER")}}的用户 (如果用户是管理员,则add(new SimplaGrantedAuthority("ROLE_ADMIN"))

您可能还必须实现UserDetailsS​​ervice。