主要还是对shiro在web项目使用的一下简要说明与实例。
首先看该项目配置相关的信息,使用的idea,创建maven项目,并在pom.xml中加入如下依赖:
org.slf4j
slf4j-api
1.7.21
org.slf4j
jcl-over-slf4j
1.7.21
runtime
ch.qos.logback
logback-classic
1.1.7
runtime
commons-dbcp
commons-dbcp
1.4
mysql
mysql-connector-java
5.1.41
org.apache.shiro
shiro-core
${shiro.version}
org.apache.shiro
shiro-web
${shiro.version}
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
jsp-api
2.1
jstl
jstl
1.2
同时web.xml配置如下:
shiro-simple-web
shiroConfigLocations
/WEB-INF/shiro.ini
org.apache.shiro.web.env.EnvironmentLoaderListener
ShiroFilter
org.apache.shiro.web.servlet.ShiroFilter
ShiroFilter
/*
REQUEST
FORWARD
INCLUDE
ERROR
由于没有借助spring等工具,shiro相关的配置通过shrio.ini完成:
[main]
#form提交的地址必须是authc.loginUrl相同
authc.loginUrl = /login.jsp
authc.successUrl= /pages/index.html
roles.unauthorizedUrl = nonrole.jsp
perms.unauthorizedUrl = nunperm.jsp
#securityManager=org.apache.shiro.mgt.DefaultWebSecurityManager
dataSource=org.apache.commons.dbcp.BasicDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/shiro
dataSource.username=root
dataSource.password=123456
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
myRealm=com.sucl.shiro.realm.MyRealm
securityManager.realms=$jdbcRealm
#多realm
#覆盖默认的securityManager
#securityManager=org.apache.shiro.mgt.DefaultSecurityManager
#authenticator
#authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
#authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
#authenticator.authenticationStrategy=$authenticationStrategy
#securityManager.authenticator=$authenticator
#authorizer
#authorizer=org.apache.shiro.authz.ModularRealmAuthorizer
#permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolver
#authorizer.permissionResolver=$permissionResolver
#securityManager.authorizer=$authorizer
[urls]
/login.jsp = authc
/index.jsp = authc
/logout = logout
/static/** = anon
/pages/** = authc
/** = authc
之前是通过定义login页面,提交请求到指定路径,然后通过Subject.login(token)完成。今天直接通过authc完成自动登录。
对于shiro作为轻量级的安全框架主要是其内部将负责的认证、鉴权都已完成,我们需要做的仅定义认证鉴权相关的逻辑关系。站在开发者的角度,shiro的整个处理过程包含以下几点:
- 创建token,一般通过form表单提交配置authc,即FormAuthenticationFilter,创建UsernamePasswordToken
- 由Subject.login(Token)进行登录认证,其实是有SecurityManager完成
- 最终调用Realm对应的doGetAuthenticationInfo方法,构建SimpleAuthenticationInfo对象,此对象有两个参数principal、credentials,第一个对象在鉴权时用到,认证时shiro只会验证credentials
- 调用Realm对应的doGetAuthorizationInfo方法,通过上一步的principal的后去对应的角色、权限信息,并封装到SimpleAuthorizationInfo即可
对与我们,若果需要扩展,比如多表登录,同表多字段登录,就可以对其中的的几个关键对象进行扩展,token、principal、SimpleAuthenticationInfo、SimpleAuthorizationInfo,具体做法下次和springmvc整合提供。
本次代码地址:https://github.com/suspring/shiro-simpler-web.git