Maven项目中shiro框架认证授权的应用(一)

认证和授权的概念

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

授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能做什么??

shiro框架的简单介绍

shiro框架的核心功能有四大部分:认证、授权、会话管理和加密。

认证流程如下:


其中,Application Code:应用程序代码,开发人员负责

Subject:框架提供的接口,代表当前用户对象。

SecurityManager:框架提供的接口,代表安全管理器对象。

Realm:可以开发人员编写,框架也可以提供,类似dao。


Maven项目中shiro框架的应用:

1,首先引入shiro框架的相关jar:

<dependency>

    <gruopId>org.apache.shiro</groupId>

    <artifactId>shiro-all</artifactId>

    <version>1.2.2</version>

<dependcy>

2,web.xml中配置spring框架提供的用于整合shiro框架的过滤器

<!-- 配置spring框架提供的用于整合shiro框架的过滤器 -->    --------------必须在struts2过滤器之前
  <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>

3,在spring配置文件中配置bean,id为shiroFilter

<!-- 配置shiro框架的过滤器工厂对象 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- 注入安全管理器对象 -->
<property name="securityManager" ref="securityManager"/>
<!-- 注入相关页面访问URL -->
<property name="loginUrl" value="/login.jsp"/>                 登录页面
<property name="successUrl" value="/index.jsp"/>                认证成功页面
<property name="unauthorizedUrl" value="/unauthorized.jsp"/>    权限不足的页面
<!--注入URL拦截规则 -->
<property name="filterChainDefinitions">
<value>
/css/** = anon                            (anon:匿名访问,不登录也能访问,authc是拦截所有请求)              
/js/** = anon
/easyUI/** = anon
/images/** = anon
/validatecode.jsp* = anon                  (验证码生成的jsp)
/login.jsp = anon
/userAction_login = anon
/page_base_staff.action = perms["staff-list"]    (perms:检查权限的过滤器,没有跳转权限不足页面)
/* = authc
</value>
</property>

</bean>

        <!-- 注册安全管理器对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"/>
<property name="cacheManager" ref="cacheManager"></property>
</bean>
<!-- 注册缓存器对象 -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<!-- 注册ehcache配置文件 -->
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml"></property>
</bean>
<!-- 注册自定义的realm -->
<bean id="bosRealm" class="xxx.BOSRealm">

</bean>

4,在登陆的servlet/action/controller中修改登录方法:

/ 用户登录功能
public String login() throws Exception {
// 1,接受页面参数
// 从域中获得验证码
String key = (String) ActionContext.getContext().getSession().get("key");
// 判断验证码是否正确
if(key.equals(checkcode) && StringUtils.isNotBlank(checkcode)){
// 验证码正确,获得当前登录用户对象
Subject subject = SecurityUtils.getSubject();
// 用户密码令牌
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),   MD5Utils.md5(model.getPassword()));               ------------用传进来的username和password生成token
try {
subject.login(token);
User user = (User) subject.getPrincipal();
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return "toIndex";
} catch (Exception e) {
this.addActionError("您输入的账号或密码有误");
return "login";
}
}else{
this.addActionError("您输入的验证码有误");
return "login";
}

}


5,realm代码的编写:

public class BOSRealm extends AuthorizingRealm{

@Autowired
private IUserDao userDao;
//认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken mytoken = (UsernamePasswordToken)token;             --------------上文生成的token
String username = mytoken.getUsername();
//根据用户名查询数据库中的密码
User user = userDao.findUserByUserName(username);
if(user == null){
//用户名不存在
return null;
}
//如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
return info;                                            -----------第一个传的是user,上文就可以取出user放到session
}
//授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}


猜你喜欢

转载自blog.csdn.net/alyone_23/article/details/79602647