使用Spring Security 限制URL访问
通常保护url方式有以下几种:
- 允许每个人访问的url
- 基于角色保护url
- 基于多个角色保护url
- 基于IP地址保护url
本文介绍如何通过spring security 实现这些功能。
指定URL
指定url最常用的方法是通过antMatcher,如果我们想保护下列url:
url | 访问限制 |
---|---|
http://www.example.com/static | 给所有人开放,如css, javascript |
http://www.example.com/register | 给所有人开放 |
http://www.example.com/login | 给所有人开放 |
http://www.example.com/user/ | ROLE_USER 和 ROLE_ADMIN 开放,如用户profile |
http://www.example.com/admin/ | 仅ROLE_ADMIN ,并且限制ip地址,如:管理员界面 |
可以简单使用:
.antMatchers("/register")
或指定多个:
.antMatchers("/register","/login","/user","/admin")
也可以指定单个页面或目录:
.antMatchers("register.html"); // Individual
.antMatchers("/admin/**"); // Directory
保护URL
保护URL常用的方法有:
- authenticated()
保护UrL,需要用户登录 - permitAll()
指定URL无需保护,一般应用与静态资源文件 - hasRole(String role)
限制单个角色访问,角色将被增加 “ROLE_” .所以”ADMIN” 将和 “ROLE_ADMIN”进行比较. 另一个方法是hasAuthority(String authority) - hasAnyRole(String… roles)
允许多个角色访问. 另一个方法是hasAnyAuthority(String… authorities)
其他有用的方法有:
- access(String attribute)
该方法使用 SPEL, 所以可以创建复杂的限制. - hasIpAddress(String ipaddressExpression)
限制IP地址或子网
一起实现上述需求
实现代码如下:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/static","/register").permitAll()
.antMatchers("/user/**").hasRoles("USER", "ADMIN") // can pass multiple roles
.antMatchers("/admin/**").access("hasRole('ADMIN') and hasIpAddress('123.123.123.123')") // pass SPEL using access method
.anyRequest().authenticated()
.and()
.formLogin()
.loginUrl("/login")
.permitAll();
}
关键点说明:
permitAll 允许所有人访问文件或目录
hasRoles 传递多个角色
access 用于复杂的访问限制
总结
本文通过示例说明spring security限制url访问的几种方法,可以利用多种不同组合实现现实需求。