1.对有没有访问权限的理解。 我们这里要对系统中的 角色组、角色、用户、功能 之间的关系要理清楚,http://blog.csdn.net/baicp3/article/details/45028013方便下面用户是否具有某一url的访问。
我们看shiro的配置文件,所以的请求都是需要用户登录的
因而用户 在登录成功时候,shiro已经把该用户是否有访问某一url的权限已经判断好了。
看下面简单的代码
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection
principalCollection) {
//获取当前登陆的用户名
String loginName =
(String) principalCollection.fromRealm(getName()).iterator().next();
//根据用户名查找对象
User user = userService.findByLoginName(loginName);
if(user != null) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//添加角色(Set集合<字符串>)
info.setRoles(user.getGroupNameSet());
//迭代用户对应的角色集合,为了获取角色对应的权限
for(UserGroup g : user.getUserGroupList()) {
//添加permission
info.addStringPermissions(g.getPermissionStringList());
}
return info;
}
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authenticationToken) throws AuthenticationException
{
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
//根据用户名去查找对象
User user = userService.findByLoginName(token.getUsername());
if(user != null) {
return new SimpleAuthenticationInfo(user.getName(),
user.getPassword(),getName());
}
return null;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
shiro其实已经帮我们写好了方法,我们只要去重写 首先看源码
本人系统这个类RapShiroRealm 去实现(抽象类AuthorizingRealm
重写doGetAuthorizationInfo方法 权限认证)
(AuthorizingRealm类又继承AuthenticatingRealm抽象类
shiro开发者帮我们写好了。重写doGetAuthenticationInfo方法 认证回调函数 登录时调用)看上面的两个方法帮助我们更好的去理解。
详细一点的步骤:
首先在访问我们controller的方法上定义好
访问该controller 需要用户携带 demo:simple.
2.由于我们重写了shiro的抽象类AuthorizingRealm
的方法doGetAuthorizationInfo 他在登录的时候就会将登录成功之后改用户是否有哪些地方的url访问权限都存放起来了。要用的时候直接如下图判断:
问题点。
我们写的类RapShiroRealm 加载时机,或者说它是怎么触发的??