0. 前置环境
代码分层结构如下图所示:

代码分层结构
1. 创建用户信息的实体
该类是一个entity,对应的是数据库中存储的登录用户的信息。我们将其命名为SystemUserInfo。当我们通过@Entity注解了该类的时候,由于JPA的支持可以自动在数据库中生成一个对应的表。
2. 通过Jpa实现数据库内用户表的接口层和服务层
接口层使用@Repository注解,并继承JpaRepository<SystemUserInfo, String>。通过这种方式实现了一个很薄的数据库访问层。
服务层使用@Service注解,并在服务层中注入对应的数据库接口对象。通过这一层就可以直接使用数据库访问接口中的方法,尤其是后续要用到的通过用户名获取用户信息实体的方法。
3. 实现认证和鉴权服务层
该层本质上也是一个服务层。在该层中注入数据库服务层的实例。并实现Spring Security的UserDetailsService接口的loadUserByUsername方法。该方法通过前台传入的用户名加载系统内存储的用户,并进行认证信息的比较。只需要简单的实现就可以了。一个例子如下:
@Service
@Slf4j
public class SystemUserDetailsService implements UserDetailsService{
@Autowired
private SystemUserAccessService systemUserAccessService;
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
log.info("登录的用户名是:{}", userName);
return new User(userName, systemUserAccessService.getUserByName(userName).getPassword(),
AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
}
}
一旦作为服务层在应用中生效,那么随着登录时候输入用户名和密码,Spring Security会用输入的用户名通过注入的实例获取据库中这样的用户实体,并把用户名,密码,角色等包装成Spring Security自己的User对象返回给框架。框架会拿这个信息和页面的实际输入进行对比,进而控制登入或者报错。
4. 对项目开启Web网络安全控制
- 添加了自定义网络配置类并使之生效,继承
WebSecurityConfigurerAdapter类。其中的配置要满足类似的复写形式。
@Configuration
@EnableWebSecurity
public class SystemWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated().and()
.formLogin();
}
}
5. 验证功能
从浏览器中访问rest接口,会自动跳转到登录页面。

登录页面
我们输入一个数据库存储的用户,那么就会跳转到我们实际访问的页面了。

跳转到登录前的页面