? Shiro 提供了base64和16进制字符串编码/解码的API支持
? 散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的
数据,常见的散列算法如MD5、SHA等
? 一般进行散列加密时都会提供一个salt,加一些干扰数据,同时可以指定散列次数
? Shiro 提供了PasswordService及CredentialsMatcher用于提供加密密码及验证密码服务。
PasswordService
用于对明文进行加密,得到密文
实现类:
? DefaultPasswordService
? 自定义密码服务实现类
CredentialsMatcher
密码匹配器
实现类:
? SimpleCredentialsMatcher 默认的密码匹配器,直接判断是否相同
? HashedCredentialsMatcher 散列密码匹配器,会对用户输入的明文密码先进行加密,然后再与数据源中的密文密码进行匹配判断
? 步骤:
注册时将密码加密后再存储
为JdbcRealm注入一个密码匹配器
#配置密码匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=md5
#将密码匹配器注入到JdbcRealm中
jdbcRealm.credentialsMatcher=$credentialsMatcher
? 步骤:
注册时将密码加密(带salt、散列次数)后再存储
自定义JdbcSaltRealm
由于无法直接通过JdbcRealm注入saltStyle
public class JdbcSaltRealm extends JdbcRealm {
//修改saltStyle的值为column
public JdbcSaltRealm() {
setSaltStyle(SaltStyle.COLUMN);
}
}
? 授权,也叫访问控制,控制用户对资源的访问
执行过程,分为四步:
Subject
发送请求
SecurityManager
接收请求,委托给Authorizer
Authorizer
授权器
Realm
查询角色和权限信息
? 在INI配置文件中用户角色的配置规则:
#用户名=密码,角色1,角色2...
[users]
admin=123,manager,teacher
tom=456,student
? 也称为基于资源的授权
? 在INI配置文件中角色权限的配置规则:角色=权限1,权限2...
? 其中权限的配置规则:资源标识符:操作:实例ID
,表示对哪个资源的哪个实例可以进行什么操作
user:update:1
product:insert:2
user:view:* 简写为 user:view
user:*:* 简写为 user 或 user:*(推荐)
*:insert:* 简写为 *:insert
user:insert,product:view
#角色=权限1,权限2...(资源:操作:实例ID)
[roles]
manager=manager:*
teacher=teacher:*,student:view
student=student:*
#重写角色的sql
jdbcRealm.userRolesQuery=select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=?
? 需要启用权限查找,设置permissionsLookupEnabled
#启用权限查找
jdbcRealm.permissionsLookupEnabled=true
#重写权限的sql
jdbcRealm.permissionsQuery=select p.permission_name from t_role r left join t_role_permission rp on r.id=rp.role_id left join t_permission p on rp.permission_id=p.id where r.role_name=?
?
? 步骤:
添加jar包
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
</dependency>
配置Shiro过滤器
<!-- 配置Shiro过滤器,用来拦截请求,进行认证和授权 -->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<!-- 将当前的Filter的生命周期将由web容器管理 -->
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
? 应用场景:有些url的访问需要登陆,未登陆时不允许访问,此时跳转到登陆页面
? 解决:配置url过滤规则
? Shiro提供的默认过滤规则有11个,常用的有4个:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<!-- url过滤规则 -->
<property name="filterChainDefinitions">
<value>
/showLogin=anon
/showRegist=anon
/user/*=authc
/product/*=authc
</value>
</property>
<!-- 重写默认的登陆失败页面,默认为/login.jsp -->
<property name="loginUrl" value="/showLogin"/>
</bean>
? 一、角色验证的步骤:
添加url过滤规则
/teacher/**=authc,roles[teacher]
/student/**=authc,roles[student]
重写角色验证的sql
<!-- 重写角色验证的sql -->
<property name="userRolesQuery">
<value>
select r.role_name from t_user u left join t_user_role ur on u.id=ur.user_id left join t_role r on ur.role_id=r.id where u.login_name=?
</value>
</property>
重写角色验证失败页面,默认显示错误码401
<!-- 重写角色验证失败页面,默认显示错误码401 -->
<property name="unauthorizedUrl" value="/401.jsp"/>
?二、角色验证的步骤:
?
? 步骤:
原文:http://blog.51cto.com/12402007/2155010