1.什么是Shiro?
Shiro是Apache的一个开源的安全框架。
2.Shiro可以做什么
提供安全认证(普通用户或管理员)、授权(该用户是否可以进行相关操作)、企业会话管理(Session)、安全加密(如MD5)
我使用的开发工具是idea,创建一个maven项目。
导入相关dependency
org.apache.shiro
shiro-core
1.2.5
junit
junit
4.12
mysql
mysql-connector-java
5.1.39
com.alibaba
druid
1.1.12
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
public class testAuthentication {
//创建一个用户Realm实例
SimpleAccountRealm simpleAccountRealm=new SimpleAccountRealm();
@Before
public void addUser(){
//添加一条信息 用户用于校验的信息集合 一般存在于数据库
//依次为用户名,密码,用户角色
simpleAccountRealm.addAccount("admin","123456","user");
}
@Test
public void authenticationtest(){
/*构建SercurityManager环境*/
DefaultSecurityManager defaultSecurityManager=new DefaultSecurityManager();
defaultSecurityManager.setRealm(simpleAccountRealm);
/*主体提交认证*/
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject= SecurityUtils.getSubject();
//用户用于检验的对象类实体
UsernamePasswordToken token=new UsernamePasswordToken("admin","123456");
subject.login(token);
//验证是否校验成功返回true或false
System.out.println(subject.isAuthenticated());
//验证是否为该种角色 若不为该角色抛出异常
subject.checkRoles("user");
}
}
测试结果:输出true
0.创建SimpleAccountRealm对象并向其中插入校验信息。
1.构造SecurityManager环境并设置Realm实例(Realm是用户实体)
2.创建主体Subject,将SecurityManager环境配置到SecurityUtils中,使主体可以与Realm交互
3.创建一个用户认证的对象UserNamePasswordToken(用户输入的用户名和密码)
4.Subject执行login操作
5.输出subject.isAuthenticated()结果
6.检查角色的真实性
操作目的:
1.认证:证明用户输入的用户名和密码与数据库中的用户名密码匹配与否。
2.授权:证明该用户是某种角色
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
public class JdbcRealmTest {
//创建一个数据源
DruidDataSource druidDataSource=new DruidDataSource();
{
//配置数据源信息
druidDataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test");
druidDataSource.setUsername("root");
druidDataSource.setPassword("123456");
}
@Test
public void authenticationtest(){
//创建一个JdbcRealm
JdbcRealm jdbcRealm=new JdbcRealm();
/*设置数据源*/
jdbcRealm.setDataSource(druidDataSource);
//设置为true时允许查询权限数据
jdbcRealm.setPermissionsLookupEnabled(true);
//设置认证查询
String sql="select password from users where username = ?";
jdbcRealm.setAuthenticationQuery(sql);
/*设置角色查询*/
String role_sql="select role_name from user_roles where username=?";
jdbcRealm.setUserRolesQuery(role_sql);
/*设置权限查询*/
String premission_sql="select permission from roles_premission where role_name = ?";
jdbcRealm.setPermissionsQuery(premission_sql);
/*构建SercurityManager环境*/
DefaultSecurityManager defaultSecurityManager=new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
/*主体提交认证*/
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject= SecurityUtils.getSubject();
/*创建一个待验证的实体*/
UsernamePasswordToken token=new UsernamePasswordToken("xiaoming","123456");
subject.login(token);
/*检查用户认证是否通过*/
System.out.println(subject.isAuthenticated());
/*检验是否为该角色*/
subject.checkRole("admin");
/*检验是否拥有该权限*/
subject.checkPermission("user:select");
}
}
前期准备:
1.建立三张表,分别是用户表user(id,username,password),角色表user_roles(id,username,role_name),权限表role_permission(id,role_name,permission)。
操作过程:
0.配置数据源DruidDataSource
1.创建JdbcRealm对象并设置数据源
2.设置认证和授权sql语句
3.构造SecurityManager环境并设置Realm实例(JdbcRealm)
4.创建主体Subject,将SecurityManager环境配置到SecurityUtils中,使主体可以与Realm交互
5.创建一个用户认证的对象UserNamePasswordToken(用户输入的用户名和密码)
6.Subject执行login操作
7.输出subject.isAuthenticated()结果
8.检查角色的真实性