String username = authenticationToken.getPrincipal().toString();
if(!username.equals(“zhang”)){
throw new UnknownAccountException(“此用户不存在”);
}
//返回验证信息,参数:1、用户名 2、正确密码 3、realm名称
return new SimpleAuthenticationInfo(username,“123”, getName());
}
}
2) 使用自定义Realm进行登录和授权
//创建默认安全管理器
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//安全管理器配置自定义Realm
securityManager.setRealm(new MyRealm());
//SecurityUtils配置安全管理器
SecurityUtils.setSecurityManager(securityManager);
//获得Subject对象
Subject subject = SecurityUtils.getSubject();
//创建账号密码token
UsernamePasswordToken user = new UsernamePasswordToken(“zhang”, “123”);
//登录验证
subject.login(user);
//权限判断
System.out.println(“是否拥有role1角色:” + subject.hasRole(“role1”));
System.out.println(“是否拥有delete权限:” + subject.isPermitted(“user:delete”));
[](
)密码加密加盐
====================================================================
用户密码一般不会以明文方式保存,这样无法保证安全性,所以一般都需要加密。
SimpleHash类可以实现基本的加密,几种创建方式:
new SimpleHash(“加密算法”,“原始密码”)
new SimpleHash(“加密算法”,“原始密码”,盐)
new SimpleHash(“加密算法”,“原始密码”,盐,迭代次数)
参数说明:
加密算法一般使用常用的md5算法
盐的作用是提高密码安全性,如两个用户的原始密码都是123,则加密后的密文都是相同的,如果破解了一个用户的密码,另一个用户的密码也一同破解了,如果给密码加盐,每个用户的盐不同,加密后密码就都会不同,增加了破解难度。
迭代次数是加密一次后,再对密文再次加密,也能提高安全性。
下面我们以md5算法对“123456”加密,盐是“007”,迭代次数为10。
SimpleHash md5 = new SimpleHash(“md5”, “123456”,ByteSource.Util.bytes(“007”), 10);
System.out.println(md5);
输出:44202d045439dc33a2e43d2828d08e19
修改MyRealm的doGetAuthenticationInfo方法,这里将密文和盐直接写在代码中,实际应用时密文和盐是通过用户名从数据库中查询出来的。
//返回验证信息,参数:1、用户名 2、正确密码 3、盐 4、realm名称
return new SimpleAuthenticationInfo(username,“44202d045439dc33a2e43d2828d08e19”, ByteSource.Util.bytes(“007”),getName());
需要给自定义Realm添加密码匹配器
//创建默认安全管理器
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//安全管理器配置自定义Realm
MyRealm realm = new MyRealm();<