目录
一:安全权限框架的选取
目前主流的安全权限框架有:shiro和security以及自定义权限框架。本人在之前都是使用的shiro框架,在一定程度上shiro框架具有简单而又通用的优势。但是这里我为什么启用security框架呢?
首先从名字可以看出security是spring 家族的一员,具有天然无缝整合spring的优势。在之前本人接触到了springcloud-aouth2中使用了security来控制权限,因此这里我们本章就基于这个security框架。
这里我们将从以下几个方面来解决spring security涉及到的内容
(1)登录登出配置
(2)权限的管理
(3)记住我的功能
(4)登录超时
...
二:功能
spring security中对于登录登出功能的功能包含:
(1)登录交由security来检测
(2)权限配置交由sercurity来配置
(3)存储用户登录的缓存(即在spring容器的上下文中都可以在这里取得当前用户的信息)
三:登录登出
这里主要是3个配置以及主要的作用如下图所示
四:代码注释
1.将登陆交由Spring security完成
这里基本上没有什么的,结合上图就能看懂
package com.config.Seurity.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.tomcat.util.security.MD5Encoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.moudle.user.model.Role;
import com.moudle.user.model.User;
import com.moudle.user.model.UserRole;
import com.moudle.user.service.UserRoleService;
import com.moudle.user.service.UserService;
import commons.utils.Md5Utils;
/*
* 自定义用户登录授权service
*/
@Service("userDetailsService")
public class LoginService implements UserDetailsService{
@Autowired
private UserService userService;
@Autowired
private UserRoleService userroleSerivce;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
List<User> userList = userService.login(username, null);
if (userList == null || userList.isEmpty()) {
throw new UsernameNotFoundException("该用户不存在!");
}
//添加权限
UserRole userRole=new UserRole();
userRole.setUserId(userList.get(0).getFkUserId());
List<Role> roleList=userroleSerivce.findUserRoleList(userRole).get(0).getRoleList();
Collection<GrantedAuthority> authorities = new ArrayList<>();
for(Role role:roleList) {
authorities.add(new SimpleGrantedAuthority(role.getRoleCode()));
}
return new org.springframework.security.core.userdetails.User(userList.get(0).getUserName(),
userList.get(0).getPassword(), authorities);
}
}
2.前台明文密码加密,与数据库比对
这里也没什么好说的,就是注意前台输入的面加密方式与存入数据库密码的方式,一致
package com.config.Seurity.pwdEnder;
import org.springframework.security.crypto.password.PasswordEncoder;
import commons.utils.Md5Utils;
import lombok.extern.slf4j.Slf4j;
/**
* 自定义加密,在这里给前台密码加密,并且与数据库比对
* ClassName: MyPasswordE