SSH学习笔记2Shiro入门2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5
}
1 注册(提交数据) 2 调用service中的录入方法(先加密,然后再调用dao中的录入方法)
2.2 密码匹配时如何匹配?
分析: 数据库:加密后的密码 前台:原始密码---------->采用相同的算法加密----------->加密后的密码进行匹配 重构源代码: UserRealm中重构:采用以下构造方法重新返回认证信息
2 shiro入门-2
回顾
无法加载配置文件jdbc.properties的解决办法:
1 @Bean
2
public PropertySourcesPlaceholderConfigurer
newPropertySourcesPlaceholderConfigurer(){
3
return new PropertySourcesPlaceholderConfigurer();
4}
学习目标
1 认证流程分析 2 实现密码加密 3 实现授权并验证
学习内容
准备工作: 1 数据表:用户表 角色表 菜单表(权限表)
2 配置log4j的日志 2.1 引入jar包
1
<!--解决Spring使用slf4j输出日志与log4j冲突的问题-->
2
<dependency>
3
<groupId>org.slf4j</groupId>
4 //获取到从数据库中取到的密码(表单)
5
Object accountCredentials = this.getCredentials(info);
6
return this.equals(tokenCredentials, accountCredentials);
7
}
2 实现密码加密
2.1 录入用户时密码加密?
HH\:mm\:ss}][%c]%m%n 20 21 # 显示sql命令 22 #mybatis显示SQL语句日志配置 23 #.mybatis=DEBUG 24 .aaa.dao=DEBUG 25
1 认证流程分析
1 登录控制器 2 UserRealm--------------->认证方法
4
<artifactId>slf4j-log4j12</artifactId>
5
<version>1.6.6</version>
6
</dependency>
7
<!-- log4j的包 -->
8
<dependency>
9
<groupId>org.slf4j</groupId>
10
<artifactId>slf4j-api</artifactId>
public static String encPassword(String source,String salt){
3
SimpleHash simpleHash=new SimpleHash("SHA-256",source,salt,1024);
4
return simpleHash.toBase64();
加密类构造方法说明:
1
public static void main(String[] args) {
2 //
SimpleHash simpleHash=new SimpleHash("加密算法");
3
4 //
SimpleHash simpleHash=new SimpleHash("算法","原始密码");
18
2.2 添加log4j.properties
1 #定义LOG输出级别 2 log4j.rootLogger=DEBUG,Console,File 3 #定义日志输出目的地为控制台 4 log4j.appender.Console=org.apache.log4j.ConsoleAppender 5 log4j.appender.Console.Target=System.out 6 #可以灵活地指定日志输出格式,下面一行是指定具体的格式 7 yout = org.apache.log4j.PatternLayout 8 yout.ConversionPattern=[%c] - %m%n 9 10 #文件大小到达指定尺寸的时候产生一个新的文件 11 log4j.appender.File = org.apache.log4j.RollingFileAppender 12 #指定输出目录 13 log4j.appender.File.File = d:/logs/ssm.log 14 #定义文件最大大小 15 log4j.appender.File.MaxFileSize = 10MB 16 # 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志 17 log4j.appender.File.Threshold = ALL 18 yout = org.apache.log4j.PatternLayout 19 yout.ConversionPattern =[%p] [%d{yyyy-MM-dd
authenticationToken;
5
//获取前端传过来的用户名
6
String username1=token.getUsername();
7
8
//连接数据库,根据用户名获取对应的用户信息
9
User user=userService.findByUserName(username1);
10
11
if(user==null){
this.getName());
19
return info;
20
}
3 返回认证信息时:AuthenticatingRealm
1 public final AuthenticationInfo getAuthenticationInfo(AuthenticationToken
token) throws AuthenticationException {
1 public boolean doCredentialsMatch(AuthenticationToken token,
AuthenticationInfo info) {
2 //获取到前台的token中传过来的原始的密码(表单)
3
Object tokenCredentials = this.getCredentials(token);
11
<version>1.6.6</version>
12
</dependency>
13
<dependency>
14
<groupId>log4j</groupId>
15
<artifactId>log4j</artifactId>
16
<version>1.2.16</version>
17
</dependency>
6
if (!cm.doCredentialsMatch(token, info)) {
7
String msg = "Submitted credentials for token [" + token +
"] did not match the expected credentials.";
8
throw new IncorrectCredentialsException(msg);
5 //
SimpleHash simpleHash=new SimpleHash("MD5","123456");
6 //
System.out.println(simpleHash.toString());
7
8
/*
9
* 用户:admin 密码:123456 加密后:aaaa salt:用户名 + 随机数字
AuthenticationInfo info) throws AuthenticationException {
2
//获取到指定的密码匹配器
3
CredentialsMatcher cm = this.getCredentialsMatcher();
4
if (cm != null) {
5
//调用匹配器的密码匹配方法
10
* 用户:user1 密码:123456 加密后:aaaa salt:用户名 + 随机数字
11
*
12
* */
13 //
SimpleHash simpleHash=new SimpleHash("加密算法","原始密
码","盐");
14
15 //
SimpleHash simpleHash=new SimpleHash("加密算法","原始密
12
throw new UnknownAccountException("用户:admin不存在");
13
}
14
15
//参数1:用户身份信息:用户名
16 //
参数2: 用户的密
17 //
参数3:当前Realm的名字
18
SimpleAuthenticationInfo info=new
SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),
9
}
10
} else {
11
throw new AuthenticationException("A CredentialsMatcher must be
configured in order to verify credentials during authentication. If you do
not wish for credentials to be examined, you can configure an " +
AllowAllCredentialsMatcher.class.getName() + " instance.");
12
}
13
}
密码匹配器类:SimpleCredentialsMatcher
17
} else {
18
log.debug("No AuthenticationInfo found for submitted
AuthenticationToken [{}]. Returning null.", token);
19
}
20
21
return info;
22
}
密码匹配:
1 protected void assertCredentialsMatch(AuthenticationToken token,
码","盐",111);
16 //
SimpleHash simpleHash=new SimpleHash("SHA-256","原始密
码","盐",111);
17
}
提供PasswordHelperபைடு நூலகம்助类,用来实现对原始密码进行加密:
1 public class PasswordHelper {
2
6
log.debug("Looked up AuthenticationInfo [{}] from
doGetAuthenticationInfo", info);
7
if (token != null && info != null) {
8
this.cacheAuthenticationInfoIfPossible(token, info);
1 @Override
2
protected AuthenticationInfo
doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws
AuthenticationException {
3
4
UsernamePasswordToken token= (UsernamePasswordToken)
2
AuthenticationInfo info = this.getCachedAuthenticationInfo(token);
3
if (info == null) {
4
//获取从Realm中从数据库中取到的用户信息
5
info = this.doGetAuthenticationInfo(token);
9
}
10
} else {
11
log.debug("Using cached authentication info [{}] to perform
credentials matching.", info);
12
}
13
14
if (info != null) {
15
//密码匹配
16
this.assertCredentialsMatch(token, info);