在知道有shiro这个东西的时候是在用springside4中看到的,看到以后发现这个东西真的蛮好用的在权限这一块。现在就说说我在学习这个shiro中对他的了解,我查阅过很多资料,但是都不具体,有人写了demo也没有说明,不过最后还是让我弄懂了,现在我就说一下这个shiro的具体的工作 流程,她是怎么验证登陆和给权限的。(shiro 整合springmvc)
第一:下载相关的shiro的jar包。
第二:写一个自己的登陆验证和赋值权限的方法ShiroRealm(方法名随意写)但是这个方法要继承AuthorizingRealm
第三:重写doGetAuthenticationinfo和doGetAuthorizationInfo关于这两个方法我要着重说一下因为好多介绍都没有说这两个方法干嘛的;首先doGetAuthenticationinfo这个方法是查询数据库中是否有这个用户(后面会说到怎么查询)。doGetAuthorizationInfo这个方法是给用户添加权限
doGetAuthenticationinfo方法具体如下:
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken authcToken) throws AuthenticationException {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
// User user = userServiceImpl.findby(token.getUsername());
User user = new User();
user.setUserName("admin");
user.setPassword("123");
System.out.println("这个是en我不知道是不是先到这里。");
// if (user != null) {
return new SimpleAuthenticationInfo(user.getUserName(),
user.getPassword(), getName());
}
这我没有查询数据库,是直接给user对象赋值了,当然真正的项目中是要进行查询的也就是我注释掉的那句话User user = userServiceImpl.findby(token.getUsername());根据用户名来查询用户是否存在,如果存在那么user就不为空,反之则user为空。然后最后一句话return则是返回一个Authenticationinfo对象,这个对象就保存这查询出来的这个用户的信息。
doGetAuthorizationinfo方法具体如下:
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
/* 这里编写授权代码 */
Set<String> roleNames = new HashSet<String>();
Set<String> permissions = new HashSet<String>();
roleNames.add("admin");
permissions.add("user.do?myjsp");
permissions.add("login.do?main");
permissions.add("login.do?logout");
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roleNames);
info.setStringPermissions(permissions);
return info;
}
这里是参考了别人写的demo他这里没有用到数据库就是写了几个页面,然后这里给的是角色和资源(也就是这个角色能访问的页面或者controller)这里我还没有用数据库测试,所以先放着。但是我感觉springside4的那个角色弄的挺好,就是自己动手做的还没有成功,等成功了再放上来。
第四:就是要写一个登陆的controller具体内容如下:
@RequestMapping("/login")
public String login(@Valid User user,ModelMap model) {
System.out.println("username"+user.getUserName());
System.out.println("password"+user.getPassword());
Subject currentUser = SecurityUtils.getSubject();//获取用户信息
//搜集实体信息
UsernamePasswordToken token = new UsernamePasswordToken(
user.getUserName(), user.getPassword());
//token.setRememberMe(true);//记住我,的功能
try {
currentUser.login(token);//登陆认证
System.out.println("最后应该是这里了。login方法");
} catch (AuthenticationException e) {
return "error";
}
return "success";
}
这里首先获取登陆页面传来的信息,重要的看currentUser.login(token);这里currentUser的login方法就是认证了,这个login方法调用了上面的doGetAuthenticationInfo方法,然后两个对比看看是否是一样的,如果一样说明数据库中有这个用户那么就成功登陆,如果不一样则说明数据库中没有这个用户那么就会转到error.jsp这个页面。
好啦,弄了两天终于弄明白了,纠结死了。还有就是没有中文的shiro api文档真的就是摸着石头过河,努力ing`````,最后如果您有更要的学习文档,能不能分享一份,谢谢。邮箱
[email protected]
备注:在shiro的配置文件中。配置访问路径权限的注释:anon:表示不登陆也能访问,authc:表示登陆后才能访问; perms[role:edit]这种的就是有role编辑权限的才能访问。
看了许多资料发现这个非常好然后记了下来:http://www.open-open.com/lib/view/open1334628062874.html