首页 > 代码库 > BOS项目 第7天(shiro权限框架进行认证和授权)

BOS项目 第7天(shiro权限框架进行认证和授权)

BOS项目笔记 第7

 

今天内容安排:

1、权限概述(认证、授权)

2、常见的权限控制的方式(URL拦截权限控制、方法注解权限控制)

3、权限数据模型(权限表、角色表、用户表、角色权限关系表、用户角色关系表)

4shiro框架入门

5、将shiro应用到bos项目中进行认证和授权

 

1. 权限概述

系统提供了很多功能,并不是所有的用户登录系统都可以操作这些功能。我们需要对用户的访问进行控制。

认证:系统提供的用于识别用户身份的功能(通常是登录功能)-----让系统知道你是谁??

授权:系统提供的赋予用户访问某个功能的能力-----让系统知道你能做什么??

 

2. 常见的权限控制的方式

2.1 URL拦截权限控制---基于过滤器或者拦截器

 

2.2 方法注解权限控制---基于代理技术

 

3. 权限模块数据模型

用户表:t_user

角色表:auth_role

权限表:auth_function

用户角色关系表:user_role

角色权限关系表:role_function

 

 

4. apache shiro

官网:http://shiro.apache.org/

Apache Shiro is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications.

提供的功能:

 

 

l shiro的程序运行流程图:

 

Application code:应用程序代码,开发人员编写的代码

Subject:主体,当前用户

SecurityManager:安全管理器,shiro框架的核心对象,管理各个组件

Realm:类似于Dao,负责访问安全数据(用户数据、角色数据、权限数据)

 

 

 

5. shiro应用到bos项目

第一步:导入shiro-all.jar

第二步:在web.xml中配置一个spring用于整合shiro的过滤器

 

第三步:在spring配置文件中配置一个beanid必须和上面的过滤器名称相同

<!-- 配置一个工厂bean,用于创建shiro框架用到过滤器 -->

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

<!-- 注入安全管理器 -->

<property name="securityManager" ref="securityManager"></property>

<!-- 注入当前系统的登录页面 -->

<property name="loginUrl" value=http://www.mamicode.com/"/login.jsp"/>

<!-- 注入成功页面 -->

<property name="successUrl" value=http://www.mamicode.com/"/index.jsp"/>

<!-- 注入权限不足提示页面 -->

<property name="unauthorizedUrl" value=http://www.mamicode.com/"/unauthorizedUrl.jsp"/>

<!-- 注入URL拦截规则 -->

<property name="filterChainDefinitions">

<value>

/css/** = anon

/images/** = anon

/js/** = anon

/login.jsp* = anon

/validatecode.jsp* = anon

/userAction_login.action = anon

/page_base_staff.action = perms["staff"]

/* = authc

</value>

</property>

</bean>

第四步:在spring配置文件中注册安全管理器,为安全管理器注入realm

<!-- 注册自定义realm -->

<bean id="bosRealm" class="com.itheima.bos.shiro.BOSRealm"></bean>

 

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<!-- 注入上面的realm -->

<property name="realm" ref="bosRealm"/>

</bean>

第五步:自定义一个BOSRealm

public class BOSRealm extends AuthorizingRealm {

@Resource

private IUserDao userDao;

/**

 * 认证方法

 */

protected AuthenticationInfo doGetAuthenticationInfo(

AuthenticationToken token) throws AuthenticationException {

System.out.println("认证方法。。。");

UsernamePasswordToken upToken = (UsernamePasswordToken) token;

String username = upToken.getUsername();// 从令牌中获得用户名

 

User user = userDao.findUserByUsername(username);

if (user == null) {

// 用户名不存在

return null;

} else {

// 用户名存在

String password = user.getPassword();// 获得数据库中存储的密码

// 创建简单认证信息对象

/***

 * 参数一:签名,程序可以在任意位置获取当前放入的对象

 * 参数二:从数据库中查询出的密码

 * 参数三:当前realm的名称

 */

SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,

password, this.getClass().getSimpleName());

return info;//返回给安全管理器,由安全管理器负责比对数据库中查询出的密码和页面提交的密码

}

}

/**

 * 授权方法

 */

protected AuthorizationInfo doGetAuthorizationInfo(

PrincipalCollection principals) {

return null;

}

}

第六步完善UserActionlogin方法

public String login(){

//生成的验证码

String key = (String) ServletActionContext.getRequest().getSession().getAttribute("key");

//判断用户输入的验证码是否正确

if(StringUtils.isNotBlank(checkcode) && checkcode.equals(key)){

//验证码正确

//获得当前用户对象

Subject subject = SecurityUtils.getSubject();//状态为未认证

String password = model.getPassword();

password = MD5Utils.md5(password);

//构造一个用户名密码令牌

AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), password);

try{

subject.login(token);

}catch (UnknownAccountException e) {

e.printStackTrace();

//设置错误信息

this.addActionError(this.getText("usernamenotfound"));

return "login";

}catch (Exception e) {

e.printStackTrace();

//设置错误信息

this.addActionError(this.getText("loginError"));

return "login";

}

//获取认证信息对象中存储的User对象

User user = (User) subject.getPrincipal();

ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);

return "home";

}else{

//验证码错误,设置错误提示信息,跳转到登录页面

this.addActionError(this.getText("validateCodeError"));

return "login";

}

}

 

第七步:在自定义Realm中编写授权方法

 

 

6. shiro提供的权限控制方式

6.1 URL拦截权限控制

 

6.2 方法注解权限控制

第一步:在spring配置文件中开启shiro的注解支持

 

第二步:在Action的方法上使用shiro的注解描述执行当前方法需要具有的权限

 

第三步修改BaseAction的构造方法

 

第四步:在struts.xml中配置全局异常捕获,统一跳转到权限不足的页面

 

6.3 页面标签权限控制

第一步:在jsp页面中引入shiro的标签

 

第二步:使用shiro的标签根据当前用户拥有的权限动态展示页面元素

 

6.4 代码级别权限(了解)

 

BOS项目 第7天(shiro权限框架进行认证和授权)