±à¼ÍƼö: |
ÎÄÕÂÖ÷Òª½éÉÜÒ»¸ö°²È«¿ò¼ÜShiro£¬²¢ÇÒÏêϸ½éÉÜÁËShiro¼Ü¹¹Í¼¡¢»·¾³´î½¨¡¢ÈÏ֤ʵÏÖÒÔ¼°ÃÜÂë¼ÓÃÜʵÏÖ·½°¸µÈÏà¹ØÄÚÈÝ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcnblogs£¬ÓÉ»ðÁú¹ûÈí¼þLuca±à¼¡¢ÍƼö¡£ |
|
Ò»¡¢Shiro¼ò½é
Apache ShiroÊÇÒ»¸öÇ¿´óÒ×ÓõÄJava°²È«¿ò¼Ü£¬ÌṩÁËÈÏÖ¤¡¢ÊÚȨ¡¢¼ÓÃܺͻỰ¹ÜÀíµÈ¹¦ÄÜ¡£
¶ÔÓÚÈκÎÒ»¸öÓ¦ÓóÌÐò£¬Shiro¶¼¿ÉÒÔÌá¹©È«ÃæµÄ°²È«¹ÜÀí·þÎñ¡£Æä²»½ö¿ÉÒÔÓÃÔÚJavaSE»·¾³£¬Ò²¿ÉÒÔÓÃÔÚJavaEE»·¾³¡£
¶þ¡¢Shiro¼Ü¹¹Í¼
1.´ÓÍⲿÀ´¿´Shiro£¬¼´´ÓÓ¦ÓóÌÐò½Ç¶ÈÀ´¹Û²ìÈçºÎʹÓÃShiroÍê³É¹¤×÷¡£ÈçÏÂͼ£º

2.´ÓShiroÄÚ²¿¿´ShiroµÄ¼Ü¹¹£¬ÈçÏÂͼËùʾ£º

Subject(org.apache.shiro.subject.Subject)µ±Ç°ÓëÈí ¼þ½øÐн»»¥µÄʵÌ壨Óû§£¬µÚÈý·½·þÎñ£¬cron
job£¬µÈ µÈ£©µÄ°²È«Ìض¨¡°ÊÓͼ¡±
SecurityManager£ºSecurityManager ÊÇ
Shiro ¼Ü¹¹µÄÐÄÔà¡£Ëü»ù±¾ÉÏÊÇÒ»¸ö¡°±£»¤É¡¡±¶ÔÏó£¬Ðµ÷Æä¹ÜÀíµÄ×é¼þÒÔÈ·±£ËüÃÇÄܹ»Ò»Æð˳ÀûµÄ¹¤×÷ÀàËÆÓÚSpringMVCÖеÄÈë¿Ú
servlet
Realms£ºÓò Realms ÔÚ Shiro ºÍÄãµÄÓ¦ÓóÌÐòµÄ°²È«Êý¾ÝÖ®¼äµ£µ± ¡°ÇÅÁº¡±»ò¡°Á¬½ÓÆ÷¡±¡£µ±Ëüʵ¼ÊÉÏÓ밲ȫÏà¹ØµÄÊý¾ÝÈçÓÃ
À´Ö´ÐÐÉí·ÝÑéÖ¤£¨µÇ¼£©¼°ÊÚȨ£¨·ÃÎÊ¿ØÖÆ£©µÄÓû§ÕÊ»§½»»¥Ê±£¬ Shiro´ÓÒ»¸ö»ò¶à¸öΪӦÓóÌÐòÅäÖõÄRealÖÐѰÕÒÐí¶àÕâÑùµÄ¶«Î÷
Shiro µÄ»·¾³´î½¨
ʹÓà shiro ʵÏֵǽµÄ²Ù×÷
µÚÒ»²½ µ¼°ü
µÚ¶þ²½£ºÊéд shiro.ini Îļþ
µÚÈý²½£ºÊéд²âÊÔ´úÂë
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFact
ory; import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory; import
org.apache.shiro.mgt.SecurityManager;
public class TestA {
public static void main(String[] args) {
//[1]½âÎöshiro.iniÎļþ
Factory<SecurityManager> factory =new
IniSecurityManagerFactory("classpath:shiro.ini
");
//[2]ͨ¹ýSecurityManager¹¤³§»ñµÃ SecurityManagerʵÀý
SecurityManager securityManager = factory.getInstance();
//[3]°ÑSecurityManager¶ÔÏóÉèÖõ½ÔËÐл·¾³ÖÐ
SecurityUtils.setSecurityManager(securityManag
er);
//[4]ͨ¹ýSecurityUtils»ñµÃÖ÷Ìåsubject Subject subject
= SecurityUtils.getSubject();
//[5]Êéд×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë---Ï൱ÓÚÓû§×Ô ¼ºÊäÈëµÄÕ˺źÍÃÜÂë
//ÎÒÃÇÄÃ×Å×Ô¼ºÊéдÓû§ÃûÃÜÂëÈ¥ºÍshiro.ini ÎÄ ¼þÖеÄÕ˺ÅÃÜÂë±È½Ï UsernamePasswordToken
token =new UsernamePasswordToken("sxt","root");
//[6]½øÐÐÉí·ÝµÄÑéÖ¤ subject.login(token);
//[7]ͨ¹ý·½·¨ÅжÏÊÇ·ñµÇ¼³É¹¦
if(subject.isAuthenticated()){ System.out.println("µÇ¼³É¹¦");
}else { System.out.println("µÇ¼ʧ°Ü");
}
}
} |
Shiro Ñé֤ʱÒì³£·ÖÎö
DisabledAccountException
ÕË»§Ê§Ð§Òì³£
ConcurrentAccessException
¾ºÕù´ÎÊý¹ý¶à
ExcessiveAttemptsException
³¢ÊÔ´ÎÊý¹ý¶à
UnknownAccountException
Óû§Ãû²»ÕýÈ·
IncorrectCredentialsException
ƾ֤£¨ÃÜÂ룩²»ÕýÈ·
ExpiredCredentialsException
ƾ֤¹ýÆÚ
Shiro--ÈÏÖ¤Á÷³Ì

Èý¡¢ShiroÉæ¼°³£¼ûÃû´Ê

ËÄ¡¢ShiroÅäÖÃÎļþÏê½â
shiro.iniÎļþ·ÅÔÚclasspathÏÂ,shiro»á×Ô¶¯²éÕÒ¡£ÆäÖиñʽÊÇkey/value¼üÖµ¶ÔÅäÖá£INIÅäÖÃÎļþÒ»°ãÊÊÓÃÓÚÓû§ÉÙÇÒ²»ÐèÒªÔÚÔËÐÐʱ¶¯Ì¬´´½¨µÄÇé¾°ÏÂʹÓá£
iniÎļþÖÐÖ÷ÒªÅäÖÃÓÐËÄ´óÀࣺmain£¬users£¬roles£¬urls
ʾÀý£º

1¡¢[main]
mainÖ÷ÒªÅäÖÃshiroµÄһЩ¶ÔÏó£¬ÀýÈçsecurityauthenticator£¬authcStrategy
µÈµÈ,ÀýÈ磺

2¡¢[users]
[users]ÔÊÐíÄãÅäÖÃÒ»×龲̬µÄÓû§£¬°üº¬Óû§Ãû£¬ÃÜÂ룬½ÇÉ«£¬Ò»¸öÓû§
¿ÉÒÔÓжà¸ö½ÇÉ«£¬¿ÉÒÔÅäÖöà¸ö½ÇÉ«£¬ÀýÈç:

3¡¢[roles]
[roles]½«½ÇÉ«ºÍȨÏÞ¹ØÁªÆðÀ´£¬¸ñʽΪ£º½ÇÉ«Ãû=ȨÏÞ×Ö·û´®1£¬È¨ÏÞ×Ö·û
´®2¡..£¬ÀýÈ磺


4¡¢[urls]
Õⲿ·ÖÅäÖÃÖ÷ÒªÔÚwebÓ¦ÓÃÖУ¬¸ñʽΪ£ºurl=À¹½ØÆ÷[²ÎÊý]£¬À¹½ØÆ÷[²ÎÊý]¡¡£¬ÀýÈç

Îå¡¢ÈÏ֤ʵÏÖ
ÈÏÖ¤£ºÑéÖ¤Óû§ÊÇ·ñºÏ·¨
ÔÚ shiro ÖУ¬Óû§ÐèÒªÌṩprincipals £¨Éí·Ý£©ºÍcredentials£¨Æ¾Ö¤£©
¸øshiro£¬´Ó¶øÊµÏÖ¶ÔÓû§Éí·ÝµÄÑéÖ¤¡£
5.1.principals(Óû§Ãû)
Éí·Ý£¬¼´Ö÷ÌåµÄ±êʶÊôÐÔ£¬¿ÉÒÔÊÇÈκζ«Î÷£¬ÈçÓû§Ãû¡¢ÓÊÏäµÈ£¬Î¨Ò»¼´¿É¡£
ÀýÈ磺Óû§Ãû/ÓÊÏä/ÊÖ»úºÅµÈ¡£
5.2.credentials(ÃÜÂë)
ƾ֤£¬¼´Ö»ÓÐÖ÷ÌåÖªµÀµÄ°²È«Öµ£¬ÈçÃÜÂë/Êý×ÖÖ¤ÊéµÈ¡£
×î³£¼ûµÄprincipalsºÍcredentials×éºÏ¾ÍÊÇÓû§Ãû/ÃÜÂëÁË¡£
5.3 ʵÏÖ²½Öè
5.3.1 µ¼Èëjar°ü
5.3.2 ´ÓÔ´ÂëµÄʾÀýÏîÄ¿quickstartÖп½±´shiro.ini·Åµ½srcÏ£¬²¢ÅäÖÃ
5.3.3 ±àд´úÂë
package com.bjsxt.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
//ʵÏÖ¼òµ¥ÈÏÖ¤
public class AuthenticationTest {
@Test
public void testAuthentication(){
//1.¹¹½¨SecurityManager¹¤³§
IniSecurityManagerFactory securityManagerFactory
= new IniSecurityManagerFactory("classpath:shiro.ini");
//2.ͨ¹ýsecurityManagerFactory¹¤³§»ñÈ¡SecurityManagerʵÀý
SecurityManager securityManager = securityManagerFactory.getInstance();
//3.½«securityManagerÉèÖõ½ÔËÐл·¾³µ±ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//4.»ñÈ¡subjectʵÀý
Subject subject = SecurityUtils.getSubject();
//5.´´½¨Óû§ÃûÃÜÂëÑéÖ¤ÁîÅÆToken
UsernamePasswordToken token = new UsernamePasswordToken
("victor","123456");
//6.½øÐÐÉí·ÝÑéÖ¤
subject.login(token);
//7.ÅжÏÊÇ·ñÈÏ֤ͨ¹ý
System.out.println(subject.isAuthenticated());
}
} |
shiro.ini
Áù¡¢JDBCRealm
ShiroĬÈÏʹÓÃ×Ô´øµÄIniRealm£¬IniRealm´ÓiniÅäÖÃÎļþÖжÁÈ¡Óû§µÄÐÅÏ¢¡£
´ó²¿·ÖÇé¿öÏÂÐèÒª´ÓϵͳµÄÊý¾Ý¿âÖжÁÈ¡Óû§ÐÅÏ¢£¬ËùÒÔÐèҪʹÓÃJDBCRealm»ò×Ô¶¨ÒåRealm¡£
ÐèÇó£ºÊ¹ÓÃJDBCRealmÌṩÊý¾ÝÔ´£¬´Ó¶øÊµÏÖÈÏÖ¤
ʵÏÖ²½Ö裺
6.1½¨users±í£¨±íÃû¡¢×ֶζÔÓ¦ÉÏ£©
6.2Ìí¼Ójar°ü£¨Êý¾Ý¿âÇý¶¯¡¢Êý¾Ý¿âÁ¬½Ó³Ø¡¢beanutilsµÈ£©
6.3±àдshiro.ini
6.4±àд²âÊÔ´úÂë
AuthenticationTest.java
package com.bjsxt.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
//ʵÏÖ¼òµ¥ÈÏÖ¤
public class AuthenticationTest {
@Test
public void testAuthentication(){
//1.¹¹½¨SecurityManager¹¤³§
IniSecurityManagerFactory securityManagerFactory
= new IniSecurityManagerFactory("classpath:shiro.ini");
//2.ͨ¹ýsecurityManagerFactory¹¤³§»ñÈ¡SecurityManagerʵÀý
SecurityManager securityManager = securityManagerFactory.getInstance();
//3.½«securityManagerÉèÖõ½ÔËÐл·¾³µ±ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//4.»ñÈ¡subjectʵÀý
Subject subject = SecurityUtils.getSubject();
//5.´´½¨Óû§ÃûÃÜÂëÑéÖ¤ÁîÅÆToken
UsernamePasswordToken token = new UsernamePasswordToken
("victor","123456");
//6.½øÐÐÉí·ÝÑéÖ¤
subject.login(token);
//7.ÅжÏÊÇ·ñÈÏ֤ͨ¹ý
System.out.println(subject.isAuthenticated());
}
} |
shiro.ini
[main]
#ÅäÖÃRealm
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
#ÅäÖÃÊý¾ÝÔ´
dataSource = com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass = com.mysql.jdbc.Driver
dataSource.jdbcUrl = jdbc:mysql:///test
dataSource.user = root
dataSource.password = victor
jdbcRealm.dataSource = $dataSource
#½«Realm×¢Èë¸øSecurityManager
securityManager.realm = $jdbcRealm |
ÈÏÖ¤²ßÂÔ
¹æ¶¨ÁËÈç¹ûÓжà¸öÊý¾ÝÔ´µÄʱºòÓ¦¸ÃÈçºÎ²Ù×÷
AtLeastOneSuccessfulStrategy
Èç¹ûÒ»¸ö£¨»ò¸ü¶à£©Realm ÑéÖ¤³É¹¦£¬ÔòÕûÌåµÄ³¢ÊÔ±»ÈÏΪÊdzɹ¦µÄ¡£
Èç¹ûûÓÐÒ»¸öÑéÖ¤³É¹¦£¬
ÔòÕûÌå³¢ÊÔʧ°Ü ÀàËÆÓÚ java ÖÐµÄ &
FirstSuccessfulStrategy
Ö»ÓеÚÒ»¸ö³É¹¦µØÑéÖ¤µÄ Realm ·µ»ØµÄÐÅÏ¢½«±»Ê¹Óá£ËùÓнøÒ»²½µÄ
Realm ½«±»ºöÂÔ¡£Èç¹ûûÓÐÒ»¸öÑéÖ¤³É¹¦£¬ÔòÕûÌå³¢ÊÔʧ°Ü¡£
ÀàËÆÓÚ java ÖÐµÄ &&
AllSucessfulStrategy
ΪÁËÕûÌåµÄ³¢ÊԳɹ¦£¬ËùÓÐÅäÖÃµÄ Realm ±ØÐëÑéÖ¤³É¹¦¡£Èç¹ûûÓÐÒ»¸öÑé
Ö¤³É¹¦£¬ÔòÕûÌå³¢ÊÔʧ°Ü
package com.bjsxt.shiro1;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestA {
public static void main(String[] args) {
/*Realm*/
//[1]½âÎöshiro.iniÎļþ
Factory<SecurityManager> factory =new
IniSecurityManagerFactory("classpath:shiro-jdbc.ini");
//[2]ͨ¹ýSecurityManager¹¤³§»ñµÃSecurityManagerʵÀý
SecurityManager securityManager = factory.getInstance();
//[3]°ÑSecurityManager¶ÔÏóÉèÖõ½ÔËÐл·¾³ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//[4]ͨ¹ýSecurityUtils»ñµÃÖ÷Ìåsubject
Subject subject = SecurityUtils.getSubject();
//[5]Êéд×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë---Ï൱ÓÚÓû§×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë
//ÎÒÃÇÄÃ×Å×Ô¼ºÊéдÓû§ÃûÃÜÂëÈ¥ºÍshiro.ini ÎļþÖеÄÕ˺ÅÃÜÂë±È½Ï
UsernamePasswordToken token =new UsernamePasswordToken("root","123");
try {
//[6]½øÐÐÉí·ÝµÄÑéÖ¤
subject.login(token);
//[7]ͨ¹ý·½·¨ÅжÏÊÇ·ñµÇ¼³É¹¦
if(subject.isAuthenticated()){
System.out.println("µÇ¼³É¹¦");
}
} catch (IncorrectCredentialsException e) {
System.out.println("µÇ¼ʧ°Ü");
}catch (UnknownAccountException e){
System.out.println("Óû§Ãû²»ÕýÈ·");
}
}
} |
[main]
#»ñµÃÊý¾ÝÔ´A
dataSou=com.mchange.v2.c3p0.ComboPooledDataSource
dataSou.driverClass=com.mysql.jdbc.Driver
dataSou.jdbcUrl=jdbc:mysql://127.0.0.1:3306/shiro
dataSou.user=root
dataSou.password=root
#ÅäÖÃÁËjdbcRealmA
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSou
#»ñµÃÊý¾ÝÔ´B
dataSou1=com.mchange.v2.c3p0.ComboPooledDataSource
dataSou1.driverClass=com.mysql.jdbc.Driver
dataSou1.jdbcUrl=jdbc:mysql://127.0.0.1:3306/shiro1
dataSou1.user=root
dataSou1.password=root
#ÅäÖÃÁËjdbcRealmB
jdbcRealm1=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm1.dataSource=$dataSou1
#ÅäÖÃÑéÖ¤Æ÷
authenticationStrategy=org. apache .shiro.authc.pam.FirstSuccessfulStrategy
#ÉèÖÃsecurityManagerÖÐrealm
securityManager.realms=$jdbcRealm,$jdbcRealm1
securityManager.authenticator.authenticationStrategy
=$authenticationStrategy |
Æß¡¢ÈçºÎ×Ô¶¨ÒåRealm
[1]ΪʲôʹÓÃ×Ô¶¨Òå Realm
ÎÒÃÇʹÓà JDBCRealm µÄʱºò·¢ÏÖ£¬shiro µÄµ×²ã×Ô¼º·â×°ÁËÊý¾Ý¿â
±íµÄÃû³ÆºÍ×ֶεÄÃû³Æ£¬ÕâÑù¾ÍÔì³ÉÁËʹÓÃÆðÀ´·Ç³£²»·½±ã
[2]½â¾ö·½°¸
×Ô¶¨Òå Realm
ÎÒÃÇÈç¹û×Ô¼º¶¨Òå realm µÄ»°£¬¿ÉÒÔʵÏÖÕâ¸ö½Ó¿Ú
×Ô¶¨ÒåRealm£¬¿ÉÒÔ×¢Èë¸øsecurityManager¸ü¼ÓÁé»îµÄ°²È«Êý¾ÝÔ´£¨ÀýÈ磬JDBCRealmÖбíºÍ×ֶζ¼ÏÞ¶¨ÁË£©
ͨ¹ýʵÏÖRealm½Ó¿Ú£¬»ò¸ù¾ÝÐèÇó¼Ì³ÐËûµÄÏàÓ¦×ÓÀ༴¿É¡£
ÐèÇó£ºÊ¹ÓÃ×Ô¶¨ÒåRealmÌṩÊý¾ÝÔ´£¬´Ó¶øÊµÏÖÈÏÖ¤
ʵÏÖ²½Ö裺
6.1Ìí¼Ójar°ü
6.2±àд×Ô¶¨ÒåRealm
6.3±àдshiro.ini
6.4±àд²âÊÔÀà
package com.bjsxt.shiro2;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserRealm extends AuthorizingRealm
{
//ÈÏÖ¤
@Override
protected AuthenticationInfo doGetAuthenticationInfo
(AuthenticationToken authenticationToken) throws
AuthenticationException {
//System.out.println(authenticationToken .getPrincipal());
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager. getConnection
("jdbc:mysql://127.0.0.1:3306/shiro",
"root", "root");
PreparedStatement prepareStatement = conn.prepareStatement("select
pwd from admin where uname =? ");
prepareStatement.setObject (1,authenticationToken.getPrincipal());
ResultSet rs = prepareStatement.executeQuery();
while (rs.next()){
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo
(authenticationToken .getPrincipal(),rs.getString("pwd"),"userRealm");
return info;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//ÊÚȨ
@Override
protected AuthorizationInfo doGetAuthorizationInfo
(PrincipalCollection principalCollection) {
return null;
}
} |
package com.bjsxt.shiro2;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestB {
public static void main(String[] args) {
/*Realm*/
//[1]½âÎöshiro.iniÎļþ
Factory<SecurityManager> factory =new
IniSecurityManagerFactory("classpath:shiro-jdbc2.ini");
//[2]ͨ¹ýSecurityManager¹¤³§»ñµÃSecurityManagerʵÀý
SecurityManager securityManager = factory.getInstance();
//[3]°ÑSecurityManager¶ÔÏóÉèÖõ½ÔËÐл·¾³ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//[4]ͨ¹ýSecurityUtils»ñµÃÖ÷Ìåsubject
Subject subject = SecurityUtils.getSubject();
//[5]Êéд×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë---Ï൱ÓÚÓû§×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë
//ÎÒÃÇÄÃ×Å×Ô¼ºÊéдÓû§ÃûÃÜÂëÈ¥ºÍshiro.ini ÎļþÖеÄÕ˺ÅÃÜÂë±È½Ï
UsernamePasswordToken token =new UsernamePasswordToken("root","123");
try {
//[6]½øÐÐÉí·ÝµÄÑéÖ¤
subject.login(token);
//[7]ͨ¹ý·½·¨ÅжÏÊÇ·ñµÇ¼³É¹¦
if(subject.isAuthenticated()){
System.out.println("µÇ¼³É¹¦");
}
} catch (IncorrectCredentialsException e) {
System.out.println("µÇ¼ʧ°Ü");
}catch (UnknownAccountException e){
System.out.println("Óû§Ãû²»ÕýÈ·");
}
}
} |
[main]
#ÉèÖÃsecurityManagerÖÐrealm
userRealm=com.bjsxt.shiro2.UserRealm
securityManager.realms=$userRealm |
¡¾´úÂëʾÀý¡¿
realms
package com.bjsxt.realms;
import java.net.ConnectException;
import java.security.interfaces.RSAKey;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import com.mysql.jdbc.Driver;
public class CustomRealm extends AuthenticatingRealm
{
private String principal;
private String credentials;
private ResultSet rs;
private Statement state;
private Connection conn;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken
token) throws AuthenticationException {
//ʹÓÃJDBC,´ÓÊý¾Ý¿â»ñÈ¡Êý¾Ý
try {
//1.×¢²áÇý¶¯
Driver driver = new Driver();
DriverManager.registerDriver(driver);
//2.»ñÈ¡Á¬½Ó¶ÔÏó
String url ="jdbc:mysql:///test";
String user = "root";
String password = "victor";
conn = DriverManager.getConnection(url , user
, password );
state = conn.createStatement();
//4.Ö´ÐÐsqlÓï¾ä
String sql = "select userName,passwd from
starLogin";
rs = state.executeQuery(sql );
//5.´¦Àí½á¹û¼¯
while (rs.next()) {
principal = rs.getString("userName");
credentials = rs.getString("passwd");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(state != null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
SimpleAuthenticationInfo simpleAuthenticationInfo
= new SimpleAuthenticationInfo(principal, credentials,
"customRealm");
return simpleAuthenticationInfo;
}
} |
AuthenticationTest
package com.bjsxt.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
//ʵÏÖ¼òµ¥ÈÏÖ¤
public class AuthenticationTest {
@Test
public void testAuthentication(){
//1.¹¹½¨SecurityManager¹¤³§
IniSecurityManagerFactory securityManagerFactory
= new IniSecurityManagerFactory("classpath:shiro.ini");
//2.ͨ¹ýsecurityManagerFactory¹¤³§»ñÈ¡SecurityManagerʵÀý
SecurityManager securityManager = securityManagerFactory.getInstance();
//3.½«securityManagerÉèÖõ½ÔËÐл·¾³µ±ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//4.»ñÈ¡subjectʵÀý
Subject subject = SecurityUtils.getSubject();
//5.´´½¨Óû§ÃûÃÜÂëÑéÖ¤ÁîÅÆToken
UsernamePasswordToken token = new UsernamePasswordToken("victor","123");
//6.½øÐÐÉí·ÝÑéÖ¤
subject.login(token);
//7.ÅжÏÊÇ·ñÈÏ֤ͨ¹ý
System.out.println(subject.isAuthenticated());
}
} |
Shrio.ini
[main]
#ÅäÖÃRealm
customRealm = com.bjsxt.realms.CustomRealm
#½«Realm×¢Èë¸øSecurityManager
securityManager.realm = $customRealm |
°Ë¡¢ÃÜÂë¼ÓÃÜʵÏÖ·½°¸
8.1¼¸ÖÖ³£¼û¼ÓÃÜËã·¨±È½Ï
8.1.1¶Ô³Æ¼ÓÃÜËã·¨(¼ÓÃÜÓë½âÃÜÃÜÔ¿Ïàͬ)

8.1.2·Ç¶Ô³ÆËã·¨(¼ÓÃÜÃÜÔ¿ºÍ½âÃÜÃÜÔ¿²»Í¬)

8.1.3 ¶Ô³ÆÓë·Ç¶Ô³ÆËã·¨±È½Ï

8.1.4 É¢ÁÐËã·¨±È½Ï¡®

8.2 MD5¼ÓÃÜ¡¢¼ÓÑÎÓëµü´ú
¼ÓÑΣº
ʹÓÃMD5´æÔÚÒ»¸öÎÊÌ⣬ÏàͬµÄpasswordÉú²úµÄHashÖµÊÇÏàͬµÄ£¬Èç
¹ûÁ½¸öÓû§ÉèÖÃÁËÏàͬµÄÃÜÂ룬ÄÇôÊý¾Ý¿âµ±¾Í»á´æ´¢ÏàͬµÄÖµ£¬ÕâÑùÊǼ«
²»°²È«µÄ¡£
¼ÓSalt¿ÉÒÔÒ»¶¨³Ì¶ÈÉϽâ¾öÕâÒ»ÎÊÌâ¡£Ëùν¼ÓSalt·½·¨£¬¾ÍÊǼӵã
¡°×ôÁÏ¡±¡£Æä»ù±¾Ïë·¨ÊÇÕâÑùµÄ£ºµ±Óû§Ê×´ÎÌṩÃÜÂëʱ£¨Í¨³£ÊÇ×¢²áʱ£©£¬
ÓÉϵͳ×Ô¶¯ÍùÕâ¸öÃÜÂëÀïÈöһЩ¡°×ôÁÏ¡±£¬È»ºóÔÙÉ¢ÁС£¶øµ±Óû§µÇ¼ʱ£¬ÏµÍ³ÎªÓû§ÌṩµÄ´úÂëÈöÉÏͬÑùµÄ¡°×ôÁÏ¡±£¬È»ºóÉ¢ÁУ¬ÔٱȽÏÉ¢ÁÐÖµ£¬À´È·¶¨ÃÜÂëÊÇ·ñÕýÈ·¡£
¼ÓÑÎÔÀí:
¸øÔÎļÓÈëËæ»úÊýÉú³ÉеÄMD5Öµ¡£
µü´ú£º¼ÓÃܵĴÎÊý
¡¾´úÂëʾÀý¡¿
md5Test
package com.bjsxt.test;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.junit.Test;
//MD5¼ÓÃÜ¡¢¼ÓÑÎÒÔ¼°µü´ú
public class MD5Test {
@Test
public void testMD5(){
//md5¼ÓÃÜ
Md5Hash md5 = new Md5Hash("123456");
System.out.println(md5);
//¼ÓÑÎ
md5 = new Md5Hash("123456", "bjsxt");
System.out.println(md5);
//µü´ú
md5 = new Md5Hash("123456", "bjsxt",
2);
System.out.println(md5);
}
} |
TestB.java
package com.bjsxt.shiro3;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
public class TestB {
public static void main(String[] args) {
/*Realm*/
//[1]½âÎöshiro.iniÎļþ
Factory<SecurityManager> factory =new
IniSecurityManagerFactory("classpath:shiro-jdbc3.ini");
//[2]ͨ¹ýSecurityManager¹¤³§»ñµÃSecurityManagerʵÀý
SecurityManager securityManager = factory.getInstance();
//[3]°ÑSecurityManager¶ÔÏóÉèÖõ½ÔËÐл·¾³ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//[4]ͨ¹ýSecurityUtils»ñµÃÖ÷Ìåsubject
Subject subject = SecurityUtils.getSubject();
//[5]Êéд×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë---Ï൱ÓÚÓû§×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë
//ÎÒÃÇÄÃ×Å×Ô¼ºÊéдÓû§ÃûÃÜÂëÈ¥ºÍshiro.ini ÎļþÖеÄÕ˺ÅÃÜÂë±È½Ï
UsernamePasswordToken token =new UsernamePasswordToken("root","111");
try {
//[6]½øÐÐÉí·ÝµÄÑéÖ¤
subject.login(token);
//[7]ͨ¹ý·½·¨ÅжÏÊÇ·ñµÇ¼³É¹¦
if(subject.isAuthenticated()){
System.out.println("µÇ¼³É¹¦");
}
} catch (IncorrectCredentialsException e) {
System.out.println("µÇ¼ʧ°Ü");
}catch (UnknownAccountException e){
System.out.println("Óû§Ãû²»ÕýÈ·");
}
}
} |
TestDemo.java
package com.bjsxt.shiro3;
import org.apache.shiro.crypto.hash.Md5Hash;
public class TestDemo {
public static void main(String[] args) {
//ʹÓÃMD5¼ÓÃÜ
Md5Hash md5=new Md5Hash("1111");
System.out.println("1111=="+md5);
//¼ÓÑÎ
md5=new Md5Hash("1111","sxt");
System.out.println("1111=="+md5);
//µü´ú´ÎÊý
md5=new Md5Hash("123","sxt",2);
System.out.println("1111=="+md5);
}
} |
shiro-jdbc.ini
[main]
#ÉèÖÃsecurityManagerÖÐrealm
credentialsMatcher=org.apache.shiro.authc. credential.HashedCredentialsMatcher
credentialsMatcher.hashAlgorithmName=md5
credentialsMatcher.hashIterations=2
userRealm=com.bjsxt.shiro3.UserRealm
userRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$userRealm |
8.3 ƾ֤ƥÅäÆ÷
ÔÚRealm½Ó¿ÚµÄʵÏÖÀàAuthenticatingRealmÖÐÓÐcredentialsMatcherÊôÐÔ¡£
ÒâΪƾ֤ƥÅäÆ÷¡£³£ÓÃÀ´ÉèÖüÓÃÜËã·¨¼°µü´ú´ÎÊýµÈ¡£
Shiro.ini
[main]
#ÅäÖÃÆ¾Ö¤Æ¥ÅäÆ÷
credentialsMatcher=org.apache.shiro.authc. credential.HashedCredentialsMatcher
#ÉèÖÃÆ¾Ö¤Æ¥ÅäÆ÷µÄÏà¹ØÊôÐÔ
credentialsMatcher.hashAlgorithmName=MD5
credentialsMatcher.hashIterations=2
#ÅäÖÃRealm
customRealm=com.bjsxt.realms.CustomRealm
#ÅäÖÃRealmµÄƾ֤ƥÅäÆ÷ÊôÐÔ
customRealm.credentialsMatcher=$credentialsMatcher
#½«Realm×¢Èë¸øSecurityManager
securityManager.realm=$customRealm |
costomRealm
package com.bjsxt.realms;
import java.net.ConnectException;
import java.security.interfaces.RSAKey;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.realm.AuthenticatingRealm;
import org.apache.shiro.util.ByteSource;
import com.mysql.jdbc.Driver;
public class CustomRealm extends AuthenticatingRealm
{
private String principal;
private String credentials;
private ResultSet rs;
private Statement state;
private Connection conn;
private String salt;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken
token) throws AuthenticationException {
//ʹÓÃJDBC,´ÓÊý¾Ý¿â»ñÈ¡Êý¾Ý
try {
//1.×¢²áÇý¶¯
Driver driver = new Driver();
DriverManager.registerDriver(driver);
//2.»ñÈ¡Á¬½Ó¶ÔÏó
String url ="jdbc:mysql:///test";
String user = "root";
String password = "victor";
conn = DriverManager.getConnection(url , user
, password );
state = conn.createStatement();
//4.Ö´ÐÐsqlÓï¾ä
String sql = "select userName,passwd,passwd_salt
from starLogin";
rs = state.executeQuery(sql );
//5.´¦Àí½á¹û¼¯
while (rs.next()) {
principal = rs.getString("userName");
credentials = rs.getString("passwd");
salt = rs.getString("passwd_salt");
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(state != null){
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ByteSource newSalt = ByteSource.Util.bytes(salt);
SimpleAuthenticationInfo simpleAuthenticationInfo
= new SimpleAuthenticationInfo(principal, credentials,newSalt
, "customRealm");
return simpleAuthenticationInfo;
}
}
|
AutenticationTest
package com.bjsxt.test;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
//ʵÏÖ¼òµ¥ÈÏÖ¤
public class AuthenticationTest {
@Test
public void testAuthentication(){
//1.¹¹½¨SecurityManager¹¤³§
IniSecurityManagerFactory securityManagerFactory
= new IniSecurityManagerFactory("classpath:shiro.ini");
//2.ͨ¹ýsecurityManagerFactory¹¤³§»ñÈ¡SecurityManagerʵÀý
SecurityManager securityManager = securityManagerFactory.getInstance();
//3.½«securityManagerÉèÖõ½ÔËÐл·¾³µ±ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//4.»ñÈ¡subjectʵÀý
Subject subject = SecurityUtils.getSubject();
//5.´´½¨Óû§ÃûÃÜÂëÑéÖ¤ÁîÅÆToken
UsernamePasswordToken token = new UsernamePasswordToken("victor","123456");
//6.½øÐÐÉí·ÝÑéÖ¤
subject.login(token);
//7.ÅжÏÊÇ·ñÈÏ֤ͨ¹ý
System.out.println(subject.isAuthenticated());
}
} |
ÊÚȨ
ÊÚȨ:¸øÉí·ÝÈÏ֤ͨ¹ýµÄÈÎÊÚÓèijЩ×ÊÔ´µÄ·ÃÎÊȨÏÞ
ȨÏÞµÄÁ£¶È ´ÖÁ£¶È ϸÁ£¶È
´ÖÁ£¶È
User ¾ßÓÐ CRUD µÄ²Ù×÷ ͨ³£Ö¸µÄÊDZíµÄ²Ù×÷
ϸÁ£¶È
Ö»ÔÊÐí²éѯ id=1 µÄÓû§ ʹÓÃÒµÎñ´úÂëʵÏÖ
Shiro µÄÊÚȨÊÇ´ÖÁ£¶È
½ÇÉ«£º½ÇÉ«¾ÍÊÇȨÏ޵ļ¯ºÏ
Shiro ÖдúÂëµÄʵÏÖ
Ïêϸ¼û´úÂë
package com.bjsxt.shiro1;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import java.util.Arrays;
public class TestA {
public static void main(String[] args) {
//[1]½âÎöshiro.iniÎļþ
Factory<SecurityManager> factory =new
IniSecurityManagerFactory("classpath:shiro.ini");
//[2]ͨ¹ýSecurityManager¹¤³§»ñµÃSecurityManagerʵÀý
SecurityManager securityManager = factory.getInstance();
//[3]°ÑSecurityManager¶ÔÏóÉèÖõ½ÔËÐл·¾³ÖÐ
SecurityUtils.setSecurityManager(securityManager);
//[4]ͨ¹ýSecurityUtils»ñµÃÖ÷Ìåsubject
Subject subject = SecurityUtils.getSubject();
//[5]Êéд×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë---Ï൱ÓÚÓû§×Ô¼ºÊäÈëµÄÕ˺źÍÃÜÂë
//ÎÒÃÇÄÃ×Å×Ô¼ºÊéдÓû§ÃûÃÜÂëÈ¥ºÍshiro.ini ÎļþÖеÄÕ˺ÅÃÜÂë±È½Ï
UsernamePasswordToken token =new UsernamePasswordToken("zs","123");
try {
//[6]½øÐÐÉí·ÝµÄÑéÖ¤
subject.login(token);
} catch (IncorrectCredentialsException e)
{
System.out.println("µÇ¼ʧ°Ü");
}
//ÊÚȨµÄ²éѯ
//»ùÓÚ½ÇÉ«µÄÊÚȨ
boolean flag = subject.hasRole("role1");
//System.out.println(flag);
//ÅжÏÊÇ·ñ¾ßÓжà¸ö½ÇÉ«
boolean[] booleans = subject.hasRoles(Arrays.asList
("role1", "role3"));
/*for(Boolean b:booleans){
System.out.println(b);
}*/
//¿ÉÒÔʹÓÃcheckRoleÅжÏÖ¸¶¨Óû§ÊÇ·ñ¾ßÓжÔÓ¦½ÇÉ«
//Èç¹ûÖ¸¶¨Óû§ÏÂûÓжÔÓ¦µÄ½ÇÉ«¾Í»áÅ׳öÒì³£ UnauthorizedException
/* subject.checkRole("role3");
subject.checkRoles("role1","role2");*/
//»ùÓÚ×ÊÔ´µÄÊÚȨ
boolean flag2 = subject.isPermitted("iii");
//System.out.println(flag2);
//ÅжÁÊÇ·ñ¾ßÓжà¸ö×ÊÔ´
boolean permittedAll = subject.isPermittedAll
("add", "oo", "ii");
//ͨ¹ýcheckPermission ½øÐÐÅжÏÖ¸¶¨Óû§ÏÂÊÇ·ñÓÐÖ¸¶¨µÄ×ÊÔ´
//Èç¹ûûÓоͻáÅ׳öUnauthorizedException
subject.checkPermission("uu");
subject.checkPermissions("ii","ooo","add");
}
} |
Role.java
package com.bjsxt.shiro1;
import org.apache.shiro.authz.annotation.RequiresRoles;
public class Role {
} |
Shiro ÖеÄÊÚȨ¼ì²éµÄ 3 ÖÖ·½Ê½
A¡¢ ±à³Ìʽ
B¡¢ ×¢½âʽ @RequiresRoles("¹ÜÀíÔ±") public void
aa(){
}
C¡¢ ±êÇ©ÅäÖà <shiro:hasPermission name="add">
<a>Ìí¼Ó²Ù×÷</a> </shiro:hasPermission>
×Ô¶¨Òå Realm ʵÏÖÊÚȨ
ÎÒÃǽö½öͨ¹ýÅäÖÃÎļþÖ¸¶¨ÊÚȨÊǷdz£µÄ²»Áé»îµÄ£¬ÔÚʵ¼ÊµÄÓ¦ÓÃÖÐÎÒÃÇÊǽ«Óû§µÄÐÅÏ¢ºÍºÏȨÏÞÐÅÏ¢±£´æµ½Êý¾Ý¿âÖУ¬ÎÒÃÇÊÇ´ÓÊý¾Ý¿âÖлñµÃÓû§µÄÐÅÏ¢
£¬Ê¹Óà JDBCRealm ½øÐÐÊÚȨ ¡£Ê¹Óà JDBCRealm ²Ù×÷µÄʱºòÒ²²»ÊǺÜÁé»î¡£ËùÒÔÎÒÃÇÒ»°ãʹÓÃ×Ô¶¨Òå
Realm ʵÏÖÊÚȨ¡£
package com.bjsxt.shiro;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserRealm extends AuthorizingRealm
{
//ÈÏÖ¤
@Override
protected AuthenticationInfo doGetAuthenticationInfo
(AuthenticationToken authenticationToken) throws
AuthenticationException {
//System.out.println(authenticationToken.getPrincipal());
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mysql://127.0.0.1:3306/shiro",
"root", "root");
PreparedStatement prepareStatement = conn.prepareStatement
("select pwd from admin where uname =? ");
prepareStatement.setObject (1,authenticationToken.getPrincipal());
ResultSet rs = prepareStatement.executeQuery();
while (rs.next()){
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo
(authenticationToken.getPrincipal(), rs.getString("pwd"),"userRealm");
return info;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//ÊÚȨ
@Override
protected AuthorizationInfo doGetAuthorizationInfo
(PrincipalCollection principalCollection) {
String username = principalCollection.getPrimaryPrincipal().toString();
//»ñµÃusername È»ºóÈ¥Êý¾Ý¿â²éѯÕâ¸öÓû§¶ÔÓ¦µÄ½ÇÉ«£¬ÔÚ¸ù¾Ý½ÇÉ«²éѯ³öÖ¸¶¨½Çɫ϶ÔÓ¦µÄ²Ëµ¥£¬
//·µ»Ø¸øÖ¸¶¨½ÇɫϵÄËùÓв˵¥--List¼¯ºÏ
System.out.println("username="+username);
//Ä£ÄâÊý¾Ý¿â²éµÄ²Ëµ¥
List<String> list =new ArrayList<>();
list.add("updateUser");
list.add("addUser");
list.add("deleteUser");
SimpleAuthorizationInfo simpleAuthorizationInfo
=new SimpleAuthorizationInfo();
for(String l:list){
simpleAuthorizationInfo.addStringPermission(l);
}
return simpleAuthorizationInfo;
}
} |
|