Spring security的介绍
- 是spring提供的一个安全框架
- 通过11个过滤器来实现认证和授权
- Spring security已经把11个过滤器做成了过滤器链,叫springSecurityFilterChain 。
- spring给大家提供好了一个专门用来加载过滤器链的过滤器对象----filter-name 固定写成要加载的过滤器链名字即可。
角色的列表和添加
创建controller
@Controller
@RequestMapping("/role")
public class RoleController {
@Autowired
private RoleService roleService;
@RequestMapping("/findAll")
public String findAll(Model model){
List<SysRole> list=roleService.findAll();
model.addAttribute("list",list);
return "role-list";
}
@RequestMapping("/save")
public String save(SysRole role){
roleService.save(role);
return "redirect:findAll";
}
}
创建service实现类
@Service
@Transactional
public class RoleServiceImpl implements RoleService {
@Autowired
private RoleDao roleDao;
@Override
public List<SysRole> findAll() {
return roleDao.findAll();
}
@Override
public void save(SysRole role) {
roleDao.save(role);
}
}
创建dao
public interface RoleDao {
@Select("select * from sys_role")
List<SysRole> findAll();
@Insert("insert into sys_role (roleName, roleDesc)" +
"values (#{roleName}, #{roleDesc})")
void save(SysRole role);
@Select("select r.* from sys_role r, sys_user_role ur where ur.roleid=r.id and ur.userid=#{uid}")
public List<SysRole> findByUid(String uid);
}
调整前端页面
ordel-list页面
<li><a
href="${pageContext.request.contextPath}/role/findAll.do">角色管理</a>
</li>
认证操作(经过数据库且加密)
认证
- <security:http 是springsecurity的基本配置标签
- auto-config=“true” 表示springsecurity会自动寻找认证页面,如果自己提供,则用自己的
- use-expressions=“true” 表示使用spring的el表达式来指定对应配置
- <security:intercept-url 指定哪些路径需要哪些角色才能访问。
pattern="/ **" 表示现在要拦截所有的请求
- access=“hasRole(‘ROLE_USER’)” 表示任何资源都必须具有ROLE_USER角色才能访问
-
- 此时ROLE_USER角色可以称为基本角色。
在 spring-security.xml 中
<!--springsecurity的主配置文件-->
<security:http auto-config="true" use-expressions="true">
<!--指定基本角色-->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
<!--认证相关配置-->
<!--
login-page="" 自定义认证页面的路径
login-processing-url="" 认证处理器路径
default-target-url="" 认证成功后跳转的页面
authentication-failure-url="" 认证失败后跳转的页面
-->
<security:form-login login-page="/login.jsp"
login-processing-url="/login"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"/>
<!--退出登录相关配置-->
<!--
invalidate-session="true" 表示退出登录后情况session
logout-url="/logout" 指定退出登录的处理器地址
logout-success-url="/login.jsp" 退出成功后跳转的路径
-->
<security:logout logout-url="/logout"
logout-success-url="/login.jsp"
invalidate-session="true"/>
<!--放开csrf拦截-->
<!--
csrf是一种网络攻击技术,springsecurity默认只要不是框架内部的请求
全部都是csrf攻击,所以我们只要使用springsecurity,csrf就一定要关闭。
-->
<security:csrf disabled="true"/>
<!--处理AccessDeniedException异常-->
<security:access-denied-handler error-page="/403.jsp"/>
</security:http>
Md5加密
-
浅层原理: 原文与密文绝对固定的一对一的键值对。
例如: -
原文:123
-
密文:202cb962ac59075b964b07152d234b70
两者之间永远固定不变。 -
弊端: 密文容易被破解。
Springsecurity的加盐加密
- 盐: 首位调换,加上用户名
认证方式:
- 先根据用户输入的用户名进行查询,没有查到,认证失败。
- 查到了,在拿用户填写的密码与密文调用matches()方法, 来确定是否是同一个密码。
代码实现
在spring的ioc容器中放入一个加盐加密的对象
方式一
在 spring-security.xml 中
<!--加盐加密对象-->
<bean id="passwordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
</bean>
<!--认证信息-->
<!--
在内存中放置两个临时用户
一个用户名是user密码也是user,角色为ROLE_USER
一个用户名是admin密码也是admin,角色为ROLE_ADMIN
springsecurity默认就是加密认证,如果要不加密认证
需要加上{noop}
-->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userServuceImpl">
<!-- <security:user name="user" password="{noop}user" authorities="ROLE_USER"/>
<security:user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>-->
</security:authentication-provider>
</security:authentication-manager>
方式二
在applicationContext.xml 中添加
<!--引入springsecurity配置文件-->
<import resource="classpath:spring-security.xml"/>