权限框架(做身份验证、授权的功能、会话管理、加密):
常见的有springsecurity(使用比较复杂) 、shiro
我们今天学习shiro
Shiro官方网站:
http://www.apache.org/
http://shiro.apache.org/
我们这里不是用最新的版本,企业一般也是这样的。
1shiroDemo ,首先创建一个java工程
2 加包
3 创建模拟数据库的数据,这里先创建一个user-realm.ini文件
[users]
#账号及密码
zhangsan=111
lishi=111
4 认证测试
public static void main(String[] args) {
first();
//second();
}
private static void first() {
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:user-realm.ini");
// 创建SecurityManager
SecurityManager securityManager=factory.getInstance();
//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject=SecurityUtils.getSubject();
在认证提交前准备token(令牌)
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan", "111");
try{
// 执行认证提交
subject.login(token);
}catch(Exception e){
e.printStackTrace();
}
//是否认证通过
boolean flag= subject.isAuthenticated();
System.out.println("flag="+flag);
}
运行结果,认证通过 true
//-------------------------------------------------------
模拟登陆认证
1认证代码测试:
public static void main(String[] args) {
//first();
second();
}
private static void second() {
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:customer-realm.ini");
// 创建SecurityManager
SecurityManager securityManager=factory.getInstance();
//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject=SecurityUtils.getSubject();
在认证提交前准备token(令牌)
UsernamePasswordToken token=new UsernamePasswordToken("aaa", "123");
try{
// 执行认证提交
subject.login(token);
}catch(Exception e){
e.printStackTrace();
}
//是否认证通过
boolean flag= subject.isAuthenticated();
System.out.println("flag="+flag);
}
2 创建customer-realm.ini 文件
a=cn.hd.test.CustomerRealm
securityManager.realms=$a
3 创建 CustomerRealm 类
package cn.hd.test;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class CustomerRealm extends AuthorizingRealm{
//身份认证 登录
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
//1、先得到你输入的用户名
String username=(String) token.getPrincipal();
//2、再根据用户名到数据库中查找是否有这个用户
// 模拟数据,假设aaa是正确的用户名 123是正确的密码
if(!"aaa".equals(username)){
return null;
}
//执行了这个说明认证通过
AuthenticationInfo info= new SimpleAuthenticationInfo(username, "123", "myrealn");
return info;
}
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
// TODO Auto-generated method stub
return null;
}
}
//md5 加密相关:
Select MD5(password) from t_user;
package cn.hd.test;
import org.apache.shiro.crypto.hash.Md5Hash;
public class Test02 {
public static void main(String[] args) {
String pwd="123456";//e10adc3949ba59abbe56e057f20f883e
Md5Hash md5=new Md5Hash(pwd);
System.out.println(md5.toString());
md5=new Md5Hash(pwd,"520");
System.out.println(md5.toString());
md5=new Md5Hash(pwd,"520",2);//md5(md5(pwd))
System.out.println(md5.toString());
}
}
注意数据库保存的密码一到要加密。
详细请看源码。
常见的有springsecurity(使用比较复杂) 、shiro
我们今天学习shiro
Shiro官方网站:
http://www.apache.org/
http://shiro.apache.org/
我们这里不是用最新的版本,企业一般也是这样的。
1shiroDemo ,首先创建一个java工程
2 加包
3 创建模拟数据库的数据,这里先创建一个user-realm.ini文件
[users]
#账号及密码
zhangsan=111
lishi=111
4 认证测试
public static void main(String[] args) {
first();
//second();
}
private static void first() {
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:user-realm.ini");
// 创建SecurityManager
SecurityManager securityManager=factory.getInstance();
//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject=SecurityUtils.getSubject();
在认证提交前准备token(令牌)
UsernamePasswordToken token=new UsernamePasswordToken("zhangsan", "111");
try{
// 执行认证提交
subject.login(token);
}catch(Exception e){
e.printStackTrace();
}
//是否认证通过
boolean flag= subject.isAuthenticated();
System.out.println("flag="+flag);
}
运行结果,认证通过 true
//-------------------------------------------------------
模拟登陆认证
1认证代码测试:
public static void main(String[] args) {
//first();
second();
}
private static void second() {
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:customer-realm.ini");
// 创建SecurityManager
SecurityManager securityManager=factory.getInstance();
//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject=SecurityUtils.getSubject();
在认证提交前准备token(令牌)
UsernamePasswordToken token=new UsernamePasswordToken("aaa", "123");
try{
// 执行认证提交
subject.login(token);
}catch(Exception e){
e.printStackTrace();
}
//是否认证通过
boolean flag= subject.isAuthenticated();
System.out.println("flag="+flag);
}
2 创建customer-realm.ini 文件
a=cn.hd.test.CustomerRealm
securityManager.realms=$a
3 创建 CustomerRealm 类
package cn.hd.test;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class CustomerRealm extends AuthorizingRealm{
//身份认证 登录
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token) throws AuthenticationException {
//1、先得到你输入的用户名
String username=(String) token.getPrincipal();
//2、再根据用户名到数据库中查找是否有这个用户
// 模拟数据,假设aaa是正确的用户名 123是正确的密码
if(!"aaa".equals(username)){
return null;
}
//执行了这个说明认证通过
AuthenticationInfo info= new SimpleAuthenticationInfo(username, "123", "myrealn");
return info;
}
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
// TODO Auto-generated method stub
return null;
}
}
//md5 加密相关:
Select MD5(password) from t_user;
package cn.hd.test;
import org.apache.shiro.crypto.hash.Md5Hash;
public class Test02 {
public static void main(String[] args) {
String pwd="123456";//e10adc3949ba59abbe56e057f20f883e
Md5Hash md5=new Md5Hash(pwd);
System.out.println(md5.toString());
md5=new Md5Hash(pwd,"520");
System.out.println(md5.toString());
md5=new Md5Hash(pwd,"520",2);//md5(md5(pwd))
System.out.println(md5.toString());
}
}
注意数据库保存的密码一到要加密。
详细请看源码。