;
// auth.inMemoryAuthentication() //内置用户
// .withUser("user").password("user").roles("USER");
}
}
需要注意的有几点,如果是用xml配置的springmvc环境下,基于javaConfig和注解配置Spring Security同样适用,只需要确保Spring的上下文能够扫描到上述的两个类即可。
如果在JSP页面下使用Spring的表单标签,该标签默认会自动添加隐藏的CSRF token标签,即防跨站伪请求攻击,如果没有使用Spring的表单标签,则需要手动添加以下标签,尤其是进行logout登出时表单提交,在Form标签内必须保护以下内容。
<input type="hiden"
value="${_csrf.token}"}
下面是登录页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>login</title>
</head>
<body>
<sf:form action="check" method="post" commandName="user" >
用户名:<sf:input path="username"></sf:input>
password:<sf:password path="password"></sf:password>
<input type="checkbox">
<label for="remember_me">Remember me</label>
<input type="submit" value="提交" >
</sf:form>
</body>
</html>
登出页面
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>User Manager</title>
</head>
<body>
<sf:form action="${ctx}/logout" method="post">
<a href="#">注销</a>
</sf:form>
</body>
</html>
如果我们想要配置自定义认证和授权服务,则需要实现UserDetailsService
public class UserDetailServiceImpl implements UserDetailsService {
private static Logger logger=Logger.getLogger(UserDetailServiceImpl.class);
@Autowired
private IUserService userService;
@Autowired
private IRoleService roleService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.info("===========授权============");
User user= null;
List<Role> role=null;
try {
user = userService.findUserByUsername(username);
role=roleService.listRoleByUserId(user.getId());
logger.info("用户角色为:"+role);
} catch (BaseException e) {
e.printStackTrace();
}
List<GrantedAuthority> list= new ArrayList<GrantedAuthority>();
list.add(new SimpleGrantedAuthority("ROLE_"+role));
org.springframework.security.core.userdetails.User authUser = new
org.springframework.security.core.userdetails.User
(user.getUsername(),user.getPassword(),list);
return authUser;
}
}
该配置将安全级别细分到角色。重写的方法传来的参数为登录的username,再通过该参数从数据库中获取用户,以及相对应的权限,最终通过 将用户、密码、权限传入并实例化org.springframework.security.core.userdetails.User ,从而授权结束。配置安全路径或者方法中的权限依据上述方法中获取并绑定的权限。至此我们就可以对路径进行安全权限保护了。
Spring Security3.1高级详细开发指南 PDF
Spring Security 学习之HTTP基本认证和HTTP摘要认证
Spring Security异常之You must provide a configuration attribute