在使用SpringSecurity时,首先要引入依赖。在我们昨天的项目中修改,首先在pom.xml的properties属性中加入此句
<spring.security.version>5.0.1.RELEASEspring.security.version>
在dependency中加入我们需要的依赖
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-webartifactId>
<version>${spring.security.version}version>
dependency>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-configartifactId>
<version>${spring.security.version}version>
dependency>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-coreartifactId>
<version>${spring.security.version}version>
dependency>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-taglibsartifactId>
<version>${spring.security.version}version>
dependency>
导入之后等待项目自己下载好jar包
在导入jar包之后,我们就需要在web.xml中添加过滤器,过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。其原理如下图所示
在web.xml中的声明
<filter>
<filter-name>springSecurityFilterChainfilter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
<filter-name>springSecurityFilterChainfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
将老师给我们的权限文件夹中的spring-security.xml文件复制到resources文件夹下面,然后在web.xml中将我们刚刚添加的spring-security.xml的路径配置到里面。
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath*:applicationContext.xml, classpath*:spring-security.xmlparam-value>
context-param>
首先在IRoleDao中声明一个函数,用来返回查找到的。
List<Role> findRoleByUserId(int id);
然后在RoleMapper文件中添加查询语句。
<select id="findRoleByUserId" parameterType="int" resultType="com.zhongruan.bean.Role">
select * from role where id in (select roleId from users_role where userId = #{userId})
select>
由于将操作由spring-Security.xml实现的,因此我们需要将UserInfoController.java中的原本的跳转语句删除。
/*@RequestMapping("login.do")
public ModelAndView checkLogin(UserInfo userInfo){
ModelAndView modelAndView = new ModelAndView();
if(userInfo.getUsername() == null){
modelAndView.setViewName("../index");
return modelAndView;
}else{
boolean flag;
flag = iUserInfoService.checkLogin(userInfo.getUsername(), userInfo.getPassword());
if (flag == true){
modelAndView.addObject("userInfo", userInfo);
modelAndView.setViewName("main");
//request.getSession().setAttribute("userinfo", userInfo);
return modelAndView;
}
modelAndView.setViewName("../failer");
return modelAndView;
}
}*/
我们还需要将UserInfoService继承自UserDetailsService。
public interface IUserInfoService extends UserDetailsService {
...
}
数据操作在UserInfoServiceImpl.java中实现,其代码如下。
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserInfo userInfo = iUserInfoDao.findUserByUsername(username);
List<Role> roles = iRoleDao.findRoleByUserId(userInfo.getId());
userInfo.setRoles(roles);
User user = new User(userInfo.getUsername(), "{noop}"+userInfo.getPassword(), getAuthority(roles));
return user;
}
private Collection<? extends GrantedAuthority> getAuthority(List<Role> roles) {
List<SimpleGrantedAuthority> list = new ArrayList<>();
for(Role role:roles){
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
}
return list;
}
这样的话我们就可以实现我们需要的操作了,但现在我们在运行之后,无论是什么权限的用户,它都可以展示用户管理的界面,但我们只想拥有ADMIN的用户拥有此权限,因此我们还需要修改aside.xml文件,使其满足我们的需要。
首先在文件头部添加
<%@taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
之后修改用户管理出标签,添加一个判断结构。
<li id="system-setting">
<security:authorize access="hasRole('ADMIN')">
<a
href="${pageContext.request.contextPath}/user/findAll.do?pages=1&size=5"> <i
class="fa fa-circle-o">i> 用户管理
a>
security:authorize>
li>
这样的话,非ADMIN权限的用户登录后就不会显示用户管理界面标签了。
这样的话我们就实现了SpringSecurity来控制不同权限的用户不同的操作。