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

shiro config 纯代码版与ini版

来源:互联网 收集:自由互联 发布时间:2021-07-03
1、javaConfig版 public void config(){DefaultSecurityManager securityManager = new DefaultSecurityManager();/** * 设置authenticator(身份认证器,处理登录,可能会有多账号登录情况, * 比如用手机号码登录或用邮
1、javaConfig版
public void config(){
		DefaultSecurityManager securityManager = 
				new DefaultSecurityManager();
		/**
		 * 设置authenticator(身份认证器,处理登录,可能会有多账号登录情况,
		 * 比如用手机号码登录或用邮箱登录)
		 */
		ModularRealmAuthenticator authenticator = 
				new ModularRealmAuthenticator();
		//设置认证规则,多个realm,一个成功即通过认证
		authenticator.setAuthenticationStrategy(
				new AtLeastOneSuccessfulStrategy());
		securityManager.setAuthenticator(authenticator);
		
		//设置authorizer(权限管理,管理“修改”,“删除”等权限)
		ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();
		/**
		 * 设置权限解析器(我们的权限信息以字符串形式存放,权限解析器实质上是处理字符串解析)
		 * WildcardPermissionResolver是shiro提供的基础实现,我们可以继承
		 * PermissionResolver接口重写我们自己的权限解析器
		 */
		authorizer.setPermissionResolver(new WildcardPermissionResolver());
		securityManager.setAuthorizer(authorizer);
		
		//设置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();
		UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
		subject.login(token);
		Assert.assertTrue(subject.isAuthenticated());
	}
2、相对应的ini版
[main]  
#authenticator  
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator  
authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy  
authenticator.authenticationStrategy=$authenticationStrategy  
securityManager.authenticator=$authenticator  
  
#authorizer  
authorizer=org.apache.shiro.authz.ModularRealmAuthorizer  
permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolver  
authorizer.permissionResolver=$permissionResolver  
securityManager.authorizer=$authorizer  
  
#datasource
dataSource=com.alibaba.druid.pool.DruidDataSource  
dataSource.driverClassName=com.mysql.jdbc.Driver  
dataSource.url=jdbc:mysql://localhost:3306/shiro_test  
dataSource.username=root  
dataSource.password=123  

#realm 
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm  
jdbcRealm.dataSource=$dataSource  
jdbcRealm.permissionsLookupEnabled=true  
securityManager.realms=$jdbcRealm
3、ModularRealmAuthenticator解析
/**
	 * 验证用户账号处理:shiro提供的实现ModularRealmAuthenticator用来处理多realm,
	 * (Realm是确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作,
	 * 也就是说一个Realm认证一个身份。我们的web应用可能会提供用户多账号登录功能,如手机号登录,邮箱登录,微信登录;
	 * 无论用什么登录,登录的是唯一的账号)
	 * ModularRealmAuthenticator中要加入验证规则AuthenticationStrategy的
	 * 实现,而验证规则要实现AuthenticationStrategy接口,shiro实现了下面几种验
	 * 证规则:
	 * 	1、FirstSuccessfulStrategy:只要有一个Realm验证成功即可,
	 * 		只返回第一个Realm身份验证成功的认证信息,其他的忽略;
	 *	2、AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可,
	 *		和FirstSuccessfulStrategy不同,返回所有Realm身份验证
	 *		成功的认证信息;
	 *	3、AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有
	 *		Realm身份验证成功的认证信息,如果有一个失败就失败了。
	 *
	 */
	
	//如果上面几种验证规则不适合我们,我们可以重写验证策略
	class MyAuthenticationStrategy implements AuthenticationStrategy{
		//在所有Realm验证之前调用  
		@Override
		public AuthenticationInfo beforeAllAttempts(
				Collection
  realms, AuthenticationToken token)
				throws AuthenticationException {

			return null;
		}
		//在每个Realm之前调用 
		@Override
		public AuthenticationInfo beforeAttempt(Realm realm,
				AuthenticationToken token, AuthenticationInfo aggregate)
				throws AuthenticationException {
			return null;
		}
		//在每个Realm之后调用
		@Override
		public AuthenticationInfo afterAttempt(Realm realm,
				AuthenticationToken token, AuthenticationInfo singleRealmInfo,
				AuthenticationInfo aggregateInfo, Throwable t)
				throws AuthenticationException {
			return null;
		}
		//在所有Realm验证之后调用
		@Override
		public AuthenticationInfo afterAllAttempts(AuthenticationToken token,
				AuthenticationInfo aggregate) throws AuthenticationException {
			return null;
		}
		
	}
网友评论