Spring Security快速入门
1. 是什么?
- Spring Security是Spring项目组中用来提供安全认证服务的框架
- 是一个轻量级的安全框架,它确保基于Spring的应用程序提供身份验证和授权支持;它与Spring MVC有很好地集成,并配备了流行的安全算法实现捆绑在一起
2、安全操作:
认证
- 认证:为用户建立一个他所声明的主题,主体一般指用户,设备可以在你的系统
授权
- 授权指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由身份验证的过程建立;
3. 入门操作
- 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.1.RELEASE</version>
</dependency>
</dependencies>
- Web.xml中创建filter
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--filter-name必须是springSecurityFilterChain -->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
- 为什么DelegatingFilterProxy的filter-name必须是springSecurityFilterChain,下一篇博客继续了解;
- 配置文件-Spring-Security.xml
// auto-config="true",Spring Security会自动生成登录表单
<security:http auto-config="true" use-expressions="false">
<!-- 配置资料连接,表示任意路径都需要ROLE_USER权限 -->
<security:intercept-url pattern="/**" access="ROLE_USER" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="{noop}user"
authorities="ROLE_USER" />
<security:user name="admin" password="{noop}admin"
authorities="ROLE_ADMIN" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
- 注释说明
- access属性:默认配置应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应url;
- 测试–设置http的auto-config=”true”时Spring Security自动生成的登录表单
4、使用自定义页面配置
<!-- 配置不过滤的资源(静态资源及登录相关) -->
<security:http security="none" pattern="/login.html" />
<security:http security="none" pattern="/failer.html" />
<security:http auto-config="true" use-expressions="false">
<security:intercept-url pattern="/**" access="ROLE_USER" />
// 自定义登陆页面,login-page 自定义登陆页面
<security:form-login login-page="/login.html"
login-processing-url="/login" username-parameter="username"
password-parameter="password" authentication-failure-url="/failer.html"
default-target-url="/success.html"/>
/* 关闭CSRF-(跨站请求伪造,俗称跨域保护),默认是开启的 */
<security:csrf disabled="true" />
</security:http>
- authentication-failure-url 用户权限校验失败之后才会跳转到这个页面,如果数据库中没有这个用户则不会跳转到这个页面
- default-target-url 登陆成功后跳转的页面
- 注:登陆页面用户名固定 username,密码password,action:login
5、退出登录
属性 | 作用 |
---|---|
invalidate-session | 退出登录后是否删除session,默认为true |
logout-url | 退出的连接 |
logout-successurl | 成功退出登录后重定向的URL |
- 注:登出操作 只需要链接到 logout即可登出当前用户,即退出登录;
/* 登出, invalidate-session 是否删除session
logout-url:登出处理链接 logout-successurl:登出成功页面
注:登出操作 只需要链接到 logout即可登出当前用户*/
<security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp" />
6、使用数据库认证
系统登录用户有很多,在配置文件中进行的单一配置是没有办法满足我们的需求的,这时候就需要跟我们的数据库联系起来啦,此处使用的是UserDetails、UserDetailsService进行的操作;
接口介绍
UserDetails
UserDetails是Spring Security提供的一个接口,封装当前进行认证的用户信息,我们可以自己对其实现,也可以使用Spring security提供的UserDetails的实现类User来实现
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
- User类的部分代码
public class User implements UserDetails, CredentialsContainer {
private String password;
private final String username;
private final Set<GrantedAuthority> authorities;
private final boolean accountNonExpired; //帐户是否过期
private final boolean accountNonLocked; //帐户是否锁定
private final boolean credentialsNonExpired; //认证是否过期
private final boolean enabled; //帐户是否可用
}
UserDetailsService
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
应用实战
xml配置,代码编写实现
- Spring-security.xml的配置
<!-- 认证器-切换成数据库中的用户名和密码 -->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userService"></security:authentication-provider>
</security:authentication-manager>
- Service
public interface IUserService extends UserDetailsService{
}
- UserServiceImpl层
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = null;
try {
userInfo = userDao.findByUsername(username);
} catch (Exception e) {
e.printStackTrace();
}
//处理自己的用户对象封装成UserDetails
User user = new User(userInfo.getUsername(), userInfo.getPassword(),
userInfo.getStatus() == 0 ? false : true, true,
true, true, getAuthority(userInfo.getRoles()));
return user;
}
//作用就是返回一个List集合(集合中是角色描述信息)
public List<SimpleGrantedAuthority> getAuthority(List<Role> roles) {
List<SimpleGrantedAuthority> list = new ArrayList<>();
for (Role role : roles) {
list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
}
return list;
}
}
对于Spring Security的基础认识与实践,操作过程的认识与理解的记录总结;