认证
(1)获取当前的Subject,调用SecurityUtils.getSubject();
(2)测试当前的用户是否已经被认证,即是否已经登录。调用Subject的isAuthenticated();
(3)若没有被认证,则把用户名和密码封装为UsernamePasswordToken对象。
①创建一个表单页面
②把请求提交到SpringMVC的Handler
③获取用户名和密码
(4)执行登录:调用Subject的login(AuthenticationToken)方法。
(5)自定义Realm的方法,从数据库中获取对应的记录,返回给Shiro。
①实际上需要继承org.apache.shiro.realm.AuthenticatingRealm类
②实现doGetAuthenticationInfo(AuthenticationToken)方法
(6)由shiro完成对密码的比对。
授权
Shiro支持三种方式的授权:
编程式:通过写if/else授权代码块完成。
注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常。
JSP/GSP标签:在JSP/GSP页面通过相应的标签完成。
2.2.授权的实现
授权需要继承AuthorizingRealm类,并实现其doGetAuthorizationInfo方法。
AuthorizingRealm类继承自AuthenticatingRealm,但没有实现AuthenticatingRealm中的doGetAuthenticationInfo,所以认证和授权只需要继承AuthorizingRealm就可以了,同时实现他的两个抽象方法。
//SimpleAuthrizationInfo用于向用户授权的类对象,这里获取对象
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();//将角色和权限信息设置到SimpleAuthorizationInfo
Subject subject = SecurityUtils.getSubject();//获取当前的对象
User principal = (User)subject.getPrincipal();//获得当前对象的唯一标识符号,是任意的形式
//给用户添加权限
info.addStringPermission(principal.getPerms());//获得user权限,并赋予当钱请求需要授权才能访问的资源用户
return info;
将SimpleAuthorizationInfo,即对于用户的授权信息返回,如果我们在上面进行的授权操作授予的权限/用户本身具有的权限包括了请求当前资源的权限,那么资源请求成功,如果不包含就请求失败