1. 仅仅通过配置文件来指定权限不够灵活,并且不方便。在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息保存到了数据库中。所以需要从数据库中去获取相关的数据信息。可以使用shiro提供的JdbcRealm来实现,也可以自定义realm来实现。使用jdbcRealm往往也不够灵活。所以在实际应用大多数情况下都是自定义realm来实现。
2. 自定义Realm需要继承AuthorizingRealm代码如下:
/** * 自定义realm的实现 该realm类提供了两个方法 * doGetAuthenticationInfo 获取认证信息 * doGetAuthorizationInfo 获取权限信息 */ public class UserRealm extends AuthorizingRealm{ @Override public String getName() { return "userRealm"; } //完成身份认证(从数据库中取数据)并且返回认证信息 //如果身份认证失败 返回null @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { //获取用户输入的用户名 String username = (String)token.getPrincipal();//获取身份信息 System.out.println("username====="+username); //根据用户名到数据库查询密码信息---模拟 //假定从数据库获取的密码为1111 String pwd = "1111"; //将从数据库中查询的信息封装到SimpleAuthenticationInfo中 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username,pwd,getName()); return info; } //授权的信息 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) { String username = principal.getPrimaryPrincipal().toString(); System.out.println("授权----------"); System.out.println("username============"+username); //根据用户名到数据库查询该用户对应的权限信息----模拟 List<String> permission = new ArrayList<String>(); permission.add("user:add"); permission.add("user:delete"); permission.add("user:update"); permission.add("user:find"); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); for(String perms:permission){ info.addStringPermission(perms); } return info; } }
配置文件:
[main] userRealm=cn.sxt.realm.UserRealm securityManager.realm=$userRealm #在realm中给定了用户信息 该用户信息可以不用配置 [users] zhangsan=1111
测试代码:
public static void main(String[] args) { Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager=factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "1111"); try { subject.login(token); if(subject.isAuthenticated()){ System.out.println("验证通过"); } } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("验证失败"); } System.out.println(subject.isPermittedAll("user:add","user:delete")); }