shiro

  1. 添加shiro依赖

  <dependency>

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

  <artifactId>shiro-spring</artifactId>

  <version>1.3.2</version>

  </dependency>

 

  1. Dao中方法定义

业务描述

在SysUserDao中添加数据访问方法

  1. 根据用户名获取用户对象
  2. 根据用户id查询用户权限标识

 

根据用户名查询用户对象的方法定义

  1. 返回值SysUser
  2. 方法名findUserByUserName
  3. 参数列表(String username)

 

根据用户名查询用户权限标识

  1. 返回值List<String>
  2. 方法名 findUserPermissions
  3. 参数列表 (Integer id)

 

代码实现:

/**

 * 根据用户名查找用户信息

 * @param username

 * @return

 */

SysUser findUserByUserName(String username);

 

/**

 * 根据用户id查找用户权限标识信息

 * 例如:sys:role:view,sys:role:add

 * @param username

 * @return

 */

SysUser findUserByUserName(Integer id);

 

      1. Mapper中元素定义

根据SysUserDao中定义的方法,添加元素定义

 

  <select id="findUserByUserName"

           resultType="sysUser">

      select *

      from sys_users  

      where username=#{username}

   </select>

 

 

<select id="findUserPermissions"

        parameterType="integer" 

        resultType="string">

select m.permission

from sys_users u join sys_user_roles ur join sys_role_menus rm  

join sys_menus m

on u.id=ur.user_id and ur.role_id = rm.role_id and rm.menu_id = m.id

where u.username = #{username}

</select>

 

 

      1. 构建Realm类

通过Realm实现基本认证及权限控制

 

public class ShiroUserRealm extends AuthorizingRealm{

@Resource

private SysUserDao sysUserDao;

@Override

protected AuthorizationInfo doGetAuthorizationInfo(

PrincipalCollection principals) {

System.out.println("==doGetAuthorizationInfo==");

String username= (String)principals.getPrimaryPrincipal();

List<String> permsList = new ArrayList<>();

permsList = sysUserDao.findUserPermissions(userId);

//用户权限列表

Set<String> permsSet = new HashSet<String>();

for(String perm : permsList){

if(perm!=null && !("".equals(perm))){

permsSet.add(perm);

}

}

System.out.println("permsSet="+permsSet);

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

info.setStringPermissions(permsSet);

return info;

}

@Override

protected AuthenticationInfo doGetAuthenticationInfo(

AuthenticationToken token) throws AuthenticationException {

        System.out.println("==doGetAuthenticationInfo==");

//1. 把 AuthenticationToken 转换为 UsernamePasswordToken

UsernamePasswordToken upToken = (UsernamePasswordToken) token;

//2. 从 UsernamePasswordToken 中来获取 username

String username = upToken.getUsername();

//判断用户名是否存在,若存在,返回user对象

SysUser user =sysUserDao.findUserByUserName(username);

//盐值.

ByteSource credentialsSalt = ByteSource.Util.bytes(user.getSalt());

//自动完成密码比对   - 密码的比对:

//通过 AuthenticatingRealm 的 credentialsMatcher 属性来进行的密码的比对!

SimpleAuthenticationInfo info =

new SimpleAuthenticationInfo(

username, user.getPassword(),credentialsSalt,getName());

return info;

}

}

      1. Service中方法定义及实现

业务描述

  1. 在SysUserService接口及实现类中添加登录方法
  2. 接收用户名及密码参数,并对其进行有效验证
  3. 执行登录认证

 

代码实现

 

@Override

public void login(String username, String password) {

Subject subject = SecurityUtils.getSubject();

if(subject.isAuthenticated())return;

// 把用户名和密码封装为 UsernamePasswordToken 对象

        UsernamePasswordToken token =

        new UsernamePasswordToken(username, password);

        try{//登录认证 - 调用userRealm

         subject.login(token);

        }catch (IncorrectCredentialsException ice) {

        throw new ServiceException("密码错误!");

        } catch(AuthenticationException ae){

        ae.printStackTrace();

        throw new ServiceException("认证失败");

        }

}

 

      1. Controller及方法定义

定义SysLoginController并添加业务处理方法

 

 

@Controller

public class SysLoginController {

@Autowired

private SysShiroService loginService;

@RequestMapping("/loginUI")

public String login(){

return "login";

}

/**登录操作*/

@RequestMapping("/login")

@ResponseBody

public JsonResult login(String username,String password){

System.out.println(username+"/"+password);

    loginService.login(username, password);

return new JsonResult("login ok");

}

}

 

 

      1. Shiro 注解应用

Shiro中通过使用@RequiresPermissions注解实现对某些方法的标识权限标识,例如,在SysUserServiceImpl类中的validById方法上添加权限检测注解。

 

@RequiresPermissions("sys:user:valid")

@Override

public int validById(Integer id, Integer valid) {

//1.合法性验证

if(id==null||id<1)

throw new ServiceException("数据不合法,id="+id);

if(valid==null)

throw new ServiceException("状态值不能为空");

if(valid!=0&&valid!=1)

throw new ServiceException("状态值不正确,valid="+valid);

//2.执行更新操作

int rows;

try{

    rows=sysUserDao.validById(id, valid);

}catch(Throwable e){

e.printStackTrace();

    //报警

throw new ServiceException("系统维护中");

}

//3.验证结果并处理

if(rows==0)

throw new ServiceException("数据可能已经不存在");

return rows;

}

 

在此方法被访问时会启动权限检查操作。

 

  1. 修改Web.xml

 

配置shiro中的核心filter,负责拦截客户端所有请求。

<!-- spring整合shiro安全框架 -->

<filter>

        <filter-name>DelegatingFilterProxy</filter-name>

        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

        <!-- 初始化参数 -->

        <init-param>

            <param-name>targetBeanName</param-name>

            <param-value>shiroFilter</param-value>

        </init-param>

</filter>

<filter-mapping>

      <filter-name>DelegatingFilterProxy</filter-name>

      <url-pattern>/*</url-pattern>

</filter-mapping>

 

说明:建议配置在所有servlet的配置上面

  1. 添加spring-shiro配置文件

配置realm对象

 

<bean id="userRealm" class="com.jt.sys.service.realm.ShiroUserRealm">

     <!-- 配置凭证算法匹配器 -->

     <property name="credentialsMatcher">

     <bean class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">

     <property name="hashAlgorithmName" value="MD5"/>

     <!-- <property name="hashIterations" value="1024"/> -->

     </bean>

     </property>

</bean>

 

配置shiro安全管理器

 

<bean id="securityManager" 

           class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

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

</bean>

 

 

配置shiro过滤器

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

         <!-- shiro的核心安全接口 -->

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

          <!-- 要求登录时的连接 -->

        <property name="loginUrl" value="/loginUI.do"></property>

         <!-- 登录成功后要跳转的连接(此处已经在登录中处理了) -->

         <!-- <property name="successUrl" value="/index.jsp"></property> -->

         <!-- 访问未对其授权的资源时,要跳转的连接

         <property name="unauthorizedUrl" value="/default.html"></property>-->

         <!-- shiro连接约束配置 -->

         <property name="filterChainDefinitions">

             <value>

                 <!-- 对静态资源设置允许匿名访问 -->

                 /bower_components/** = anon

                 /build/** = anon

                 /dist/** = anon

                 /plugins/** = anon

                 /doLogin.do = anon

                 <!-- 退出 -->

                 /logout.do = logout  <!-- 会调用Subject的logout方法,此方法会将session清空 -->

                 <!-- 剩余其他路径,必须认证通过才可以访问 -->

                 /** = authc

             </value>

         </property>

     </bean>

   

 

Shiro生命周期处理器

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

 

启用shiro注解权限检查

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>

<bean  class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

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

</bean>

 

 

​​​​​​​Shiro 缓存配置

Step01: 添加ehcache 依赖

 

  <dependency>

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

    <artifactId>shiro-ehcache</artifactId>

   <version>1.3.2</version>

  </dependency>

 

 

Step02: 添加ehcache 配置文件

 

在项目的src/main/resources目录下添加ehcache.xml

 

Step03:  Spring 中配置ehcache 配置文件

 

 

<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">

        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/> 

</bean>

 

将cacheManager添加到securityManager中

     <bean id="securityManager" 

           class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

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

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

     </bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值