当前位置 : 主页 > 编程语言 > c++ >

shiro登录认证(简易版,JdbcRealm)

来源:互联网 收集:自由互联 发布时间:2021-07-03
1.1、shiro登录,使用shiro提供的JdbcRealm进行数据库验证,用的是阿里的数据库连接池,数据库和JdbcRealm有关 public void simpleConfig(){DefaultSecurityManager securityManager = new DefaultSecurityManager();//设
1.1、shiro登录,使用shiro提供的JdbcRealm进行数据库验证,用的是阿里的数据库连接池,数据库和JdbcRealm有关
public void simpleConfig(){
		DefaultSecurityManager securityManager = 
				new DefaultSecurityManager();
		
		//设置alibaba数据库连接池
		DruidDataSource dataSource = new DruidDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test");
		dataSource.setUsername("root");
		dataSource.setPassword("123");
		
		/**
		 * 设置Realm(就是我们获取用户/权限的类,可能存在数据库中,
		 * 可能存在LDAP中,可能存在redis中),一般Realm是我们自己实现的
		 * 继承AuthorizingRealm即可实现重写Realm实现类
		 * 我们这里使用shiro提供的处理数据库的Realm:JdbcRealm 
		 */
		JdbcRealm realm = new JdbcRealm();
		realm.setDataSource(dataSource);
		realm.setPermissionsLookupEnabled(true);
		securityManager.setRealm(realm);
		
		SecurityUtils.setSecurityManager(securityManager);
		
		//开始登陆认证
		Subject subject = SecurityUtils.getSubject();
		//当前登录用户“zhang”,密码“123”
		UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
		subject.login(token);
		Assert.assertTrue(subject.isAuthenticated());
	}
1.2、JdbcRealm源码中的SQL语句与数据库表
JdbcRealm中默认的sql语句:
String DEFAULT_AUTHENTICATION_QUERY = "select password from users where username = ?";
String DEFAULT_SALTED_AUTHENTICATION_QUERY = "select password, password_salt from users where username = ?";
String DEFAULT_USER_ROLES_QUERY = "select role_name from user_roles where username = ?";
String DEFAULT_PERMISSIONS_QUERY = "select permission from roles_permissions where role_name = ?";

我们可以修改默认的sql来匹配我们自己建的数据库,以下是JdbcRealm的几个方法:
public void setAuthenticationQuery(String authenticationQuery); 对应:DEFAULT_AUTHENTICATION_QUERY,DEFAULT_SALTED_AUTHENTICATION_QUERY
public void setUserRolesQuery(String userRolesQuery);           对应:DEFAULT_USER_ROLES_QUERY
public void setPermissionsQuery(String permissionsQuery);       对应:DEFAULT_PERMISSIONS_QUERY

我们一般自己编写Realm,不使用JdbcRealm,JdbcRealm毕竟比较建议;如果仅作为测试用,
就只想使用JdbcRealm,我们下面提供了与JdbcRealm相匹配的建表语句;

!需要注意的是本例的数据库名为 “shiro_test” !
1.3、与JdbcRealm相匹配的数据库建表语句
create table users (
  id bigint auto_increment,
  username varchar(100),
  password varchar(100),
  password_salt varchar(100),
  constraint pk_users primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_users_username on users(username);

create table user_roles(
  id bigint auto_increment,
  username varchar(100),
  role_name varchar(100),
  constraint pk_user_roles primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_user_roles on user_roles(username, role_name);

create table roles_permissions(
  id bigint auto_increment,
  role_name varchar(100),
  permission varchar(100),
  constraint pk_roles_permissions primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_roles_permissions on roles_permissions(role_name, permission);

insert into users(username,password)values('zhang','123');
网友评论