1、Spring Security 框架入门 小Demo
2、pom.xml 依赖
3、web.xml springSecurity配置 Filter
4、spring-Security.xml
//login.html 设置页面不需要登陆也可以访问 相当于白名单
<http pattern="/login.html" security="none"></http>
//页面拦截部分
<!--use-expressions 是否启用SPEL表达式,默认是true-->
<http use-expressions="false">
<!--/**包括这个目录以及这个目录下的所有子目录,都匹配 access="ROLE_User" 角色名称必须以ROLE_开头-->
<!--当前用户必须有当前ROLE_USER的角色,才可访问根目录,以及子目录-->
<intercept-url pattern="/**" access="ROLE_USER"/>
//use-expressions="false" 不配为false
//<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
//开启表单登陆功能 login-page="登陆页面" default-target-url="登陆成功后的页面" always-use-default-target="true" 总是跳转到登陆后的默认页面
<form-login login-page="/login.html" default-target-url="/index.html" always-use-default-target="true"/>
//关闭默认的token认证,未关闭前前防止CSRF攻击,不关闭页面必须是jsp页面,可以在自动生成的页面拷贝
<csrf disabled="true"/>
//框架也允许使用iframe,不被拦截
<headers>
<frame-options policy="SAMEORIGIN">
</headers>
//登出
<logout/>
</http>
//认证管理器
<authentication-manager>
//认证的提供方
<authentication-provider>
<user-service>
//authorities 属于那个角色
<user name="admin" password="123456" authorities="ROLE_USER">
</user-service>
</authentication-provider>
</authentication-manager>
5、启动项目会自动生成登录页面
6、自已创建一个登录页面
<form action="/login" method="post">
<input name="username">
<input name="password">
</from>
7、显示登录名
@Controller
loginController{
@RequestMapping("/name")
public Map name(){
String username= SecuriryContextHodel.getContext().getAuthentication().getName();
}
}
___________________________________________________________________
8、密码在数据库中
/**
认证类
*/
public class UserDEtailsServiceImpl implements UserDetailsService{
//必须实现的方法
public UserDetails loadUserByUsername(String username) throws UserNameNotFoundException(){
//new User(用户名,"密码",拥有的角色)
//构建一个角色列表
List<GrantedAuthority> grantAuths=new ArrayList();
grantAuths.add(new SimpleGrantedAuthority("ROLE_SELLER"));
return new User(username,"123456",grantAuths);
//return null; 密码错误返回null
}
}
9、springSecurity.xml
//login.html 设置页面不需要登陆也可以访问 相当于白名单
<http pattern="/*.html" security="none"></http>
<http pattern="/seller/add.do" security="none"></http>
//页面拦截部分
<!--use-expressions 是否启用SPEL表达式,默认是true-->
<http use-expressions="false">
<!--/**包括这个目录以及这个目录下的所有子目录,都匹配 access="ROLE_User" 角色名称必须以ROLE_开头-->
<!--当前用户必须有当前ROLE_USER的角色,才可访问根目录,以及子目录-->
<intercept-url pattern="/**" access="ROLE_SELLER"/>
//use-expressions="false" 不配为false
//<intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
//开启表单登陆功能 login-page="登陆页面" default-target-url="登陆成功后的页面" always-use-default-target="true" 总是跳转到登陆后的默认页面
<form-login login-page="/login.html" default-target-url="/index.html" always-use-default-target="true"/>
//关闭默认的token认证,未关闭前前防止CSRF攻击,不关闭页面必须是jsp页面,可以在自动生成的页面拷贝
<csrf disabled="true"/>
//框架也允许使用iframe,不被拦截
<headers>
<frame-options policy="SAMEORIGIN">
</headers>
//登出
<logout/>
</http>
//认证管理器
<authentication-manager>
//认证的提供方
<authentication-provider user-service-ref="userDetailService">
//密码加密用的算法
<password-encoder ref="passwordEncoder"></password-encoder>
</authentication-provider>
</authentication-manager>
//认证类
<beans:bean id="userDetailService" class="......UserDEtailsServiceImpl">
//使用set注入远程获取service接口实现类,因为用的是dubbox
<beans:property name="sellService" ref="sellerService"> </beans:property>
</beans:bean>
//引入dubbox
<dubbox:application name="此工程名"/>
<dubbox:registry address="zookeeper://zk地址"/>
//远程到注册中心找接口的实现,相当于bean
<dubbox:reference id="sellerService" interface="....sellerServiceImpl"></dubbox:reference>
//登陆时告诉用什么密码加密,密码加密的工具类
<beans:bean id="passwordEncoder" class="....BcryptPasswordEncoder">
10.密码加密
MD5: 加密32位的字符串 不可逆(哈希算法)
伪解谜:通过海量数据
BCrypt加密算法 (60个位数的字符串)
//密码加密
BcryptPasswordEncoder passwordEncoder=new BcryptPasswordEncoder();
String password=passwordEncoder.encode(user.getPassword());
user.setPassword(password);