1.Spring Security认证
使用UserDetails、UserDetailsService来完成认证操作。
(1)UserDetails是一个接口,我们可以 认为UserDetails作用是于封装当前进行认证的用户信息,但由于其是一个 接口,所以我们可以对其进行实现,也可以使用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();
}
(2)UserDetailsService规范了我们在做认证时具体执行哪个方法
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
2.用户登录
(1)导入jar包
在Pom.xml文件的dependencies标签中添加以下内容,IDEA会自动导入jar包
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>${spring.security.version}</version>
</dependency>
(2)配置过滤器
在Web.xml文件中配置以下内容
<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>
(3)新建spring-security.xml文件
在web.xml中添加classpath
<!-- 配置加载类路径的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml,classpath*:spring-security.xml</param-value>
</context-param>
(4) 添加页面
jsp页面
(5)Userservice extend UserDetailsService
@Service("userService")
//userServiceImpl
public class UserServiceImpl implements IUserService {
@Autowired
private IUserInfoDao userDao;
@Autowired
private IRoleDao roleDao;
@Override
//这个方法的作用在于根据用户名从数据库中取出用户的账号信息和角色信息,并转化成Spring Security规定的用户信息和角色信息格式
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//定义一个用户实体类
UserInfo userInfo = null;
//根据用户名从数据库获取用户信息
userInfo = userDao.getUserInfoByName(username);
//根据用户id从数据库获取用户的持有的角色信息
List<Role> roles = roleDao.getByUserId(userInfo.getId());
userInfo.setRoles(roles);
//创建一个框架定义的User对象,并把用户名和密码和权限信息作为构造函数的参数传进去
User user = new User(username, "{noop}" + userInfo.getPassword(), getAuthority(userInfo.getRoles()));
return user;
}
private List<SimpleGrantedAuthority> getAuthority(List<Role> roles) {
//创建一个存框架定义的角色列表的list
List<SimpleGrantedAuthority> list = new ArrayList<>();
//遍历数据库中取出的角色列表,并将之转化为框架认可的角色列表
for (Role role : roles) {
list.add(new SimpleGrantedAuthority("ROLE_" + role.getRoleName()));
}
return list;
}
}