序文
ログ機能がshiroの統合によって達成されます。
件名、セキュリティマネージャおよびレルム:史郎は、3つのコアコンポーネントがあります。
-
件名:現在のユーザーのセキュリティ動作を表し、セキュリティマネージャは、セキュリティ操作のすべてのユーザーを管理します。
-
セキュリティマネージャは:セキュリティマネージャによって内部コンポーネントのインスタンスを管理する四郎、典型的なファサードパターン、四郎のコアフレームワークであり、それを介してサービスのセキュリティ管理の多様性を提供します。
(Facade模式
:複雑なサブシステムの数に一貫性のあるインターフェースを提供することにより、これらのサブシステムに簡単アクセス・モードは、内部サブシステムの特定のための心配なしに統一されたインタフェース、外部アプリケーションがある外国のモードです。詳細が表示されます。) -
レルム:史郎とアプリケーションのセキュリティデータ間の「ブリッジ」または「コネクター」としてレルム行為。つまり、ときにユーザーが行う認証(ログイン)および承認(アクセス制御)検証は、史郎は、アプリケーション構成レルム内のユーザーとその権限から情報を検索します。
注:以下の手順では、我々は最初の認定の主要なを達成する、リソースの最後の増加は、認証に基づいて機能を承認しました
まず、依存性の導入
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
第二に、書き込みあるUserRealmクラス(のみ認定)
public class UserRealm extends AuthorizingRealm {
@Autowired
UserService userService;//用于mybatis查询数据库用户信息的服务层
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
UsernamePasswordToken token= (UsernamePasswordToken) authenticationToken;
String username=token.getUsername();
User userByName = userService.findUserByName(username);
//如果用户根本不存在
if(userByName==null)
{
return null; //如果返回null,会抛出UnknownAccountException
}
//将真正的密码给到shiro 他会自动帮我们处理
return new SimpleAuthenticationInfo("",userByName.getPassword(),"");
}
}
ユーザーが存在しない場合はそのノートは、上記で、私たちはnullに直接戻る、史郎が自動的にスローされますUnknownAccountException
。ユーザーが存在しますが、パスワードは、エラーがスローされます場合はIncorrectCredentialsException
、例外がスローされない、正しいパスワードを入力します。
それが何であるかを使用スローこれらの2つの例外として、我々は後で言います。
第三に、shiroConfigの設定クラスを作成します(認証のみ)
@Configuration
public class shiroConfig {
/**
* 创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager)
{
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
//添加shiro内置过滤器
//常用的过滤器
//anon 无需认证
//authc 必须认证才可以访问
//user 如果使用rememberme 的功能可以直接访问
//perms 该资源必须授权资源权限才可以访问
//role 必须得到角色权限才可以访问
Map<String,String> filterMap = new LinkedHashMap<String,String>();
//这里将add和update这种操作拦截
filterMap.put("/html/addUserShiro.html","authc");
filterMap.put("/html/updateUserShiro.html","authc");
//设置拒绝后返回页面
shiroFilterFactoryBean.setLoginUrl("/html/loginShiro.html");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
/**
* 创建DefaultWebSecurityManager
*/
@Bean(name ="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm)
{
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
}
/**
* 创建realm
*/
@Bean(name ="userRealm") //使用Bean注解:方法返回的对象给spring管理
public UserRealm getUserRealm()
{
return new UserRealm();
}
}
第四に、簡単に試し書きコントローラ
@RequestMapping(value="/loginShiro" )
@ResponseBody
public RespBean loginShiro(HttpServletRequest httpServletRequest) throws IOException {
String username=httpServletRequest.getParameter("username");
String pwd=httpServletRequest.getParameter("password");
//1. 获取subject
Subject subject = SecurityUtils.getSubject();
//2. 封装用户数据
UsernamePasswordToken token=new UsernamePasswordToken(username,pwd);
//3.执行登录判断
try {
subject.login(token);
return RespBean.ok("success");
}catch (UnknownAccountException e)
{
return RespBean.error("账户不存在!");
}catch (IncorrectCredentialsException e)
{
return RespBean.error("密码错误!");
}
}
史郎は、状況に応じてスローされますのでUnknownAccountException
とIncorrectCredentialsException
異常な、我々は、上記のコントローラをキャプチャすることができます。
ファイブ簡単なテストは、郵便配達のログインを行いました
私たちは郵便配達テストURLのログイン、データベース、予め記憶されたユーザー名とパスワードは、wuyuehangユーザー情報です。
ログインアカウントのパスワードが正しい場合は
、この時点コントローラは例外なので、成功した着陸をスローしません。
ログオンしているユーザーが存在しない場合、我々はヌルの正面に返す、史郎がスローされます。UnknownAccountException
アカウント情報が存在しない返し、コントローラをキャッチされた例外を、。
間違ったパスワードは、パスワードは史郎になると、四郎はスロー、間違ったパスワードを発見したIncorrectCredentialsException
例外を、それはパスワードエラーメッセージを返すために、コントローラに巻き込まれています。
これは、組み合わせ史郎とログインです。
第六に、実際の認証試験
次に、我々はこのような機能をテストします。
- インタフェースの直接アクセスauthcはタイプであれば、認証は自動的にログイン画面にジャンプしませんので。
- ログイン後、認証された、あなたはauthcはインタフェースにアクセスすることができます
私たちは、上のクラスをshiroConfig "/html/addUserShiro.html"
し、"/html/updateUserShiro.html"
切片に二つの経路及び適切にアクセスする前に認証されなければならない二つのパスを指定します。レッツ・テストそれ
-
最初の直接アクセスは
"/html/addUserShiro.html"
、無認証ので、我々は自動的に良いを設定するためにジャンプします"/html/loginShiro.html"
-
ログイン画面でログインにジャンプ、ログインが成功すると、我々はテストインタフェースにジャンプします
私たちの前に、それぞれこれらの二つのハイパーリンクのauthcはを設定し、インターセプトする必要認証インターフェース。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>查询成绩</title>
</head>
<body>
<a href="/html/addUserShiro.html">add</a>
<a href="/html/updateUserShiro.html">update</a>
</body>
</html>
クリックするだけの後、我々は、ログイン認証後、我々は入って来たことがわかります。
この時点で、ユーザ認証は、彼らがブロックされたインターフェイスにアクセスする前に、後に(つまり、ログインに成功しています)。
次は、一部のユーザーは認証され、私たちはまだ権限を制御する必要があることのが、史郎を操作することを許可、認可アプリケーションシナリオを実装してみましょう。
セブン認証の設定
そして認定は、我々が最初に行う必要がリソース許可パーマにインターセプタを設定され、例えば、我々は、傍受を承認されたリソースを追加しました
filterMap追加shiroconfigクラス
filterMap.put("/html/addUserShiro.html","perms[user_add]");
任意の文字列をUSER_ADDが、ここでは文字列の後ろにあるものである必要があるでしょう。
その後、我々はログインして認証を完了した後、その後をクリックして/html/addUserShiro.html
、このパスは、次のインターフェイスは、インターフェイスが動作しませんリソースへの認証済みアクセスした後、表示されます。
その理由は次のとおりです。無許可、以下に示すように、同様に、我々はまた、不正なHTMLインターフェイスをカスタマイズすることができます
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>拒绝访问</title>
</head>
<body>
<h1>您好,您没有访问该界面的权限!</h1>
</body>
</html>
shiroconfigクラスを追加します。
shiroFilterFactoryBean.setUnauthorizedUrl("/html/Unauthorized.html");
テスト再び
次のdoGetAuthorizationInfo方法あるUserRealmクラスのロジックコード私たちの書き込みの許可
//授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
info.addStringPermission("user_add");
return info;
}
このように、我々はいくつかのテストを実行するために、承認されたリソースを終了し
、リソースがアクセスリソースHTML成功に認可された後に認証した後、元にアクセスすることができません。