在学习Apache Shiro框架之前,我们要清楚ApacheShiro框架能够帮助我们完成什么功能呢?以下就是Apache Shiro框架所能做的事情:1、 验证用户。
2、 在任何环境下都可以使用SessionAPI。
3、 可以使用多个用户数据库。例如一个是oracle数据库,另外一个是masql数据库。
4、 对用户执行访问控制,如:判断用户是否拥有角色admin或者判断用户时候拥有访问的权限。
5、 单点登录(sso)功能
Apache Shiro框架提供的权限控制的方式:
1、 url拦截器进行权限控制(框架提供了很多过滤器进行url拦截)
2、 方法注解进行权限控制(框架提供了在方法上使用的注解,为Action创建代理对象,进行权限控制)
3、 页面标签权限控制(框架提供了一套完整标签,用于根据权限展示或者隐藏按钮或者菜单)
4、 代码级别权限控制(不常使用)
以下是我从网上找到的一个Shiro框架执行流程图:
Application Code:应用程序代码,由开发人员负责开发
Subject:当前用户
SecurityManager:安全管理器,管理所有的用户,认证、授权等。
Realm:安全数据桥,类似于Dao,负责访问安全数据(安全的是数据指用户名 密码 权限等。)
shiro框架在项目中的应用:
第一步:在web.xml中配置一个过滤器代理对象。
<!-- 加入spring框架提供的过滤器代理对象(配置shiroFilter) --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第二步:在spring配置文件中配置一个名称为shiroFilter的bean。
在配置文件中我们配置了一个bosRealm类,这个bosRealm类就是Shiro框架的核心部分,下面我们通过登录代码来演示一下。<!-- 配置shiro的bean --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 注入安全管理对象 --> <property name="securityManager" ref="securityManager"></property> <!-- 登陆页面url的地址 --> <property name="loginUrl" value="/login.jsp"></property> <!-- 成功登陆跳转的页面 --> <property name="successUrl" value="/index.jsp"></property> <!-- 权限不足跳转的页面 --> <property name="unauthorizedUrl" value="/unauthorized.jsp"></property> <!-- 基于url拦截,使用过滤器进行拦截 --> <property name="filterChainDefinitions"> <value> /css/** = anon <!-- anon代表可以直接访问,就是匿名访问 --> /images/** = anon /js/** = anon /validatecode.jsp* = anon /login.jsp = anon /userAction_login.action = anon /page_base_staff.action = perms["staff"] <!-- 不光需要登陆,还需要权限 --> /** = authc <!-- 登陆完认证之后才能访问 --> </value> </property> </bean> <!-- 安全管理对象 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="bosRealm"></property> <!-- 自定义的realm类 --> </bean> <bean id="bosRealm" class="cn.itcast.bos.shiro.BOSRealm"></bean>
BOSRealm类必须继承AuthorizingRealm类,它里面主要有两个方法,一个是认证的,另一个是授权的。
//认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { //获取到令牌 UsernamePasswordToken myToken = (UsernamePasswordToken)token; //获取到令牌中的用户名 String username = myToken.getUsername(); //获取到令牌中的密码 char[] password = myToken.getPassword(); //从数据库中根据用户名查询用户 User user = (User) userDao.findByUsername(username); if (user==null) { return null; } //将查询到的用户保存到info,返回到权限管理器中。 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getClass().getName()); return info; }
//授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { //获得信息对象 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //信息对象授予相应的权利 info.addStringPermission("staff"); return info; }
下面是用户登录的密码
在这里我们可以知道shiro框架是使用抛出不同的异常来实现认证的。//用户登录 public String login(){ //判断验证码是否正确 String vcheckcode = (String)ServletActionContext.getRequest().getSession().getAttribute("key"); if(StringUtils.isBlank(checkcode) || !checkcode.equals(vcheckcode)){ this.addActionError(this.getText("checkcodeError")); return "login"; }else{ //获得当前用户 Subject subject = SecurityUtils.getSubject(); //获得输入的用户名 String username = model.getUsername(); //获得输入的密码 String password = model.getPassword(); //md5加密密码 password = MD5Utils.md5(password); //获得令牌 AuthenticationToken token = new UsernamePasswordToken(username,password); try { subject.login(token);//调用安全管理器,由安全管理器去调用realm //获取BOSRealm中的user User user = (User)subject.getPrincipal(); //将user保存到session中 ServletActionContext.getRequest().getSession().setAttribute("user", user); } catch (UnknownAccountException e) { e.printStackTrace(); this.addActionError("用户名不存在"); return "login"; } catch(IncorrectCredentialsException e){ this.addActionError("密码错误"); return "login"; } } return "index"; }
以上就是关于Shiro框架的知识和应用,希望能给各位程序员提供一些帮助
项目权限控制的管家——Apache Shiro框架
最新推荐文章于 2024-07-23 09:20:09 发布