编辑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;理解它。)
答案 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"))
。
您可能还必须实现UserDetailsService。